2

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

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

我只想知道插入记录的最有效方法,这样就没有完全相同的记录的重复。

先感谢您!

4

4 回答 4

3

您知道如何在列上创建唯一索引。

只需在所有应该是唯一的列上都这样做:

create unique index foo 
on tablename(columnone, columntwo, columnthree);

请注意,需要这样做可能表明您的表没有充分标准化。

于 2009-04-02T00:23:36.510 回答
1

您可以向表定义添加唯一约束并包括所有列(我相信主键除外)。唯一约束创建索引,所以我不知道这可能会对性能产生什么样的影响,但我猜列越少越好。

这会将这样的约束添加到现有表中:

ALTER TABLE SampleTable
ADD CONSTRAINT [uc_UniqueRow] UNIQUE (Column1, Column2, Column3)

请注意,列类型等存在某些限制,因此这可能适用于您的表格,也可能不适用。有关详细信息,请参阅联机丛书:http: //msdn.microsoft.com/en-us/library/ms177420 (sql.90).aspx

于 2009-04-02T00:24:08.893 回答
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)

运行下半部分两次,它不会再插入一次记录。

于 2009-04-01T23:58:38.753 回答
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>
于 2009-08-26T04:31:49.590 回答