唯一约束,如何避免重复

时间:2011-09-13 16:59:06

标签: php mysql

根据我之前的查询that post,我有一个如下表:

|| *nid* || *language* ||
|| 8 || Chinese ||
|| 8 || Portuguese ||
|| 8 || German |

'nid'和'language'具有唯一约束。

使用此设置,当我尝试插入新行时,如何确保不会有任何重复?

EDITED

我猜我应该尝试进行如下查询:

SELECT * FROM lang WHERE nid = $nid AND language = $lang

如果返回FALSE,那么我知道我现在可以插入我的数据了。这是对的吗?

4 个答案:

答案 0 :(得分:5)

通过创建唯一键来强制执行唯一约束:

ALTER TABLE the_table
ADD UNIQUE INDEX nid_language_unique (nid, language);

此约束禁止两行具有相同的nid和语言。

任何试图违反约束的查询都将失败。

由于您要忽略错误(并且仍然中止查询),您可以使用INSERT IGNOREUPDATE 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或语言(因此,如果你不处理它,你的程序就会崩溃)。