我正试图在mySQL数据库中存储一对多关系,如果可能的话,我希望避免重复条目。
我在互联网上读到,"on DUPLICATE KEY UPDATE"是一个选项。这对我的情况有用吗?
代码:
function insert_options($uid, $array) {
if(!is_array($array)) {
return false;
}
$db = db_connect();
foreach($array as $a) {
$sql = 'INSERT INTO newsletter_coupon_codes_options (uid, option_name, value) VALUES (?, ?, ?)';
$stmt = $db->prepare($sql);
if($stmt === false) {
echo "Prepare failed: (" . $db->errno . ") " . $db->error;
}
$stmt->bind_param('iss', $uid, $a, $value);
$value = '1';
$stmt->execute();
}
}
表格
UID(INT11), OPTION_NAME(varchar(255)), VALUE(INT(11))
我试图将ON DUPLICATE KEY UPDATE value = 1
添加到$sql
语句中,但似乎没有任何作用。基本上,我想确保在插入数据时,如果uid
和option_name
存在,它只会将value
设置为1
,而不会创建新条目。
我没有设置唯一密钥,只有uid
上的主键。我不知道该做什么才是独一无二的。我不能使uid
唯一,因为每个uid
将有多个条目。我也不能使option_name
唯一,因为多个uid
的将有相同的option_name
实现这一目标的最佳方法是什么?
将查询更改为
INSERT INTO newsletter_coupon_codes_options (uid, option_name, value)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE value = VALUES(value)
这是SQLFiddle演示
并且确保您对(uid, option_name)
有UNIQIE
或PRIMARY KEY
约束,例如
ALTER TABLE newsletter_coupon_codes_options
ADD UNIQUE (uid, option_name);
请这样更改您的查询,并使用mysqli_query函数执行此类查询,使用mysqli_real_escape_string函数避免SQL注入
$sql = 'INSERT INTO newsletter_coupon_codes_options
(uid, option_name, value) VALUES ("'.$uid.'", "'.$option_name.'", "'.$value.'")
ON DUPLICATE KEY UPDATE value = "'.$value.'"';