【发布时间】:2011-08-18 10:38:36
【问题描述】:
如何唯一标识两列或多列,我在数据库中使用了名为地址的表,现在地址有街道名称、套房名称和街道编号等字段。
字符串 |字符串 |姓氏
1 | xyz | 32
1 | xyz | 32
现在我如何才能使这三列独一无二。那就是我想检查这三列是否已经插入。如果任何字段值更改为正常,它将插入新的。但万一所有三个相似的字段..帮助我结合识别这三个字段。
【问题讨论】:
如何唯一标识两列或多列,我在数据库中使用了名为地址的表,现在地址有街道名称、套房名称和街道编号等字段。
字符串 |字符串 |姓氏
1 | xyz | 32
1 | xyz | 32
现在我如何才能使这三列独一无二。那就是我想检查这三列是否已经插入。如果任何字段值更改为正常,它将插入新的。但万一所有三个相似的字段..帮助我结合识别这三个字段。
【问题讨论】:
您可以通过添加unique 约束来实现。
ALTER TABLE your_table ADD UNIQUE(strnum, strnam, sutname);
然后您执行以下操作:
INSERT IGNORE INTO your_table (strnum, strnam, sutname) VALUES ('1', 'xyz', 'etc');
如果值已经存在 - 不会发生插入,也不会引发错误(这就是 IGNORE 部分)。
顺便问一下,您为什么使用如此短而模糊的列名?现在已经不是 DOS 时代了,你可以用你的列名来描述。
【讨论】:
$query = "SELECT * FROM `address` WHERE `strnum` = '$strnum' AND `strnam` = '$strnam' AND `sutname` = '$sutname' LIMIT 1";
$result = mysql_query($query);
if (!mysql_num_rows($result)) {
// If you get to here, there is no existing record
$query = "INSERT INTO `address` (`strnum`,`strnam`,`sutname`) VALUES ('$strnum','$strnam','$sutname')";
if (!mysql_query($query)) print('Insert failed!');
} else print('Record already exists!');
编辑我刚刚添加了一个缺失的;,所以这个解析...
【讨论】:
UNIQUE 多字段索引?当您尝试进行重复插入时,这不会引发重复键错误吗?
INSERT IGNORE,那么它不会出错并且会忽略您要插入的数据。或者,还有“INSERT... ON DUPLICATE KEY UPDATE”语句,允许您更新您点击的唯一键的行。
只需将它们作为唯一键添加到表结构中,您将无法插入其中两个
【讨论】:
你可以这样做
SELECT * FROM table WHERE col1 = $something AND col2 = $something2 AND col3 = $something3
(记住转义 php 变量) 如果记录被返回,则表示它存在。您还可以添加 LIMIT 1 以使其更快。
如果您的问题是关于确保表中没有重复出现(对于这 3 列),那么最好的解决方案可能是在这三列上添加唯一索引。
【讨论】: