根据我之前的查询that post,我有一个如下表:
|| *nid* || *language* ||
|| 8 || Chinese ||
|| 8 || Portuguese ||
|| 8 || German |
'nid'和'language'具有唯一约束。
使用此设置,当我尝试插入新行时,如何确保不会有任何重复?
EDITED
我猜我应该尝试进行如下查询:
SELECT * FROM lang WHERE nid = $nid AND language = $lang
如果返回FALSE,那么我知道我现在可以插入我的数据了。这是对的吗?
答案 0 :(得分:5)
通过创建唯一键来强制执行唯一约束:
ALTER TABLE the_table
ADD UNIQUE INDEX nid_language_unique (nid, language);
此约束禁止两行具有相同的nid和语言。
任何试图违反约束的查询都将失败。
由于您要忽略错误(并且仍然中止查询),您可以使用INSERT IGNORE和UPDATE IGNORE:
INSERT IGNORE INTO the_table (nid, language) VALUES (8, 'Chinese')
/* row not inserted and no error */
答案 1 :(得分:1)
如果您确实在数据库中建立了唯一约束,那么MySQL将不允许您插入第二行。该声明将引发例外。您可以在代码中捕获并忽略它。如果您对是否添加了行不感兴趣,可以在MySQL INSERT INTO命令中使用IGNORE键,并且将添加该行(如果不存在),或者命令将完成而不会出现错误。
答案 2 :(得分:1)
SELECT nid,语言FROM lang WHERE nid = $ nid AND language = $ lang
如果返回FALSE,那么我知道我现在可以插入我的数据了。这是对的吗?
是的,但你需要写:
$nid = mysql_real_escape_string($_POST['nid']);
$lang = mysql_real_escape_string($_POST['lang']);
$query = SELECT nid, language FROM lang WHERE nid = '$nid' AND language = '$lang'
// notice the quotes ^ ^ ^ ^
如果您忘记了这些,您的查询会出错(并且会受到SQL注入的威胁)。
如果你有一个唯一约束,你可以继续插入数据,因为MySQL会为你做上述测试。
答案 3 :(得分:0)
您可以在代码中使用计数器(不是SQL,而是用于使用SQL的计数器,如PHP,或者)
您可以使用MySQL max函数并添加一个(如max(nid)+1(但不记得MySQL的max函数))
你可以使用一个包含10个字符的随机数(这样你就会有很小的风险进入错误)
我多次使用第一种和最后一种方式。
如果您想确保不会有重复内容,请使用上一篇文章中的解决方案。像UNIQUE约束这样的东西会阻止你插入两次相同的nid或语言(因此,如果你不处理它,你的程序就会崩溃)。