有没有办法插入整个记录唯一的SQL数据库?我知道你可以制作主键和独特列,但这不是我想要的。
在不重载数据库的情况下执行此操作的最佳方法是什么?我见过一种子查询,你使用“WHERE NOT EXISTS()”
我只想知道插入记录的最有效方法,以便不存在与EXACT相同记录的重复。
提前谢谢!
答案 0 :(得分:3)
您知道如何在列上创建唯一索引。
只需将所有列组合在一起,这些列应该是唯一的:
create unique index foo
on tablename(columnone, columntwo, columnthree);
请注意,执行此操作的需要可能表示您的表格没有充分规范化。
答案 1 :(得分:1)
您可以为表定义添加唯一约束并包含所有列(我相信主键除外)。唯一约束创建索引,因此我不知道这可能会对性能产生什么影响,但我猜测列越少越好。
这会将这样的约束添加到现有表中:
ALTER TABLE SampleTable
ADD CONSTRAINT [uc_UniqueRow] UNIQUE (Column1, Column2, Column3)
请注意,对列类型等有一些限制,因此这可能适用于您的表格,也可能不适用。有关详细信息,请参阅联机丛书:http://msdn.microsoft.com/en-us/library/ms177420(sql.90).aspx
答案 2 :(得分:0)
你可以这样做:
create table #temp (val1 varchar(30), val2 varchar(30))
declare @val1 varchar(30),@val2 varchar(30)
select @val1='josh',@val2='bob'
insert into #temp
select @val1, @val2
where not exists (select * from #temp where val1=@val1 and val2=@val2)
运行下半部两次,它不会再插入一次记录。
答案 3 :(得分:0)
你的问题非常明确(不确定为什么其他人回答了你特别想要排除的东西),以及我花了一个多小时试图找到的东西......
此链接最有帮助 http://www.timrosenblatt.com/blog/2008/03/21/insert-where-not-exists/
在mySQL 5.1.35上......
mysql> CREATE TABLE testDupeSyntax (name varchar(10), place varchar(20) );
Query OK, 0 rows affected (0.13 sec)
mysql>
mysql> INSERT INTO testDupeSyntax SELECT 'mango1', 'mango2' FROM DUAL WHERE NOT
EXISTS( SELECT name FROM testDupeSyntax WHERE name='mango1' LIMIT 1 );
Query OK, 1 row affected (0.06 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM testDupeSyntax;
+--------+--------+
| name | place |
+--------+--------+
| mango1 | mango2 |
+--------+--------+
1 row in set (0.00 sec)
mysql> INSERT INTO testDupeSyntax SELECT 'mango1', 'mango2' FROM DUAL WHERE NOT
EXISTS( SELECT name FROM testDupeSyntax WHERE name='mango1' LIMIT 1 );
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM testDupeSyntax;
+--------+--------+
| name | place |
+--------+--------+
| mango1 | mango2 |
+--------+--------+
1 row in set (0.00 sec)
mysql> INSERT INTO testDupeSyntax SELECT 'mango1', 'mango2' FROM DUAL WHERE NOT
EXISTS( SELECT name FROM testDupeSyntax WHERE name='mango1' AND place='mango2' LIMIT 1 );
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM testDupeSyntax;
+--------+--------+
| name | place |
+--------+--------+
| mango1 | mango2 |
+--------+--------+
1 row in set (0.00 sec)
mysql> INSERT INTO testDupeSyntax SELECT 'mango1', 'mango2' FROM DUAL WHERE NOT
EXISTS( SELECT name FROM testDupeSyntax WHERE name='mango1' AND place='mango3' LIMIT 1 );
Query OK, 1 row affected (0.05 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM testDupeSyntax;
+--------+--------+
| name | place |
+--------+--------+
| mango1 | mango2 |
| mango1 | mango2 |
+--------+--------+
2 rows in set (0.00 sec)
mysql>