SQL唯一记录不是列?

时间:2009-04-01 23:46:55

标签: sql insert duplicate-data

有没有办法插入整个记录唯一的SQL数据库?我知道你可以制作主键和独特列,但这不是我想要的。

在不重载数据库的情况下执行此操作的最佳方法是什么?我见过一种子查询,你使用“WHERE NOT EXISTS()”

我只想知道插入记录的最有效方法,以便不存在与EXACT相同记录的重复。

提前谢谢!

4 个答案:

答案 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>