SQL уникальная запись не столбец? - PullRequest
2 голосов
/ 02 апреля 2009

Есть ли способ вставить в базу данных SQL, где вся запись уникальна? Я знаю, что вы можете создавать первичные ключи и уникальные столбцы, но это не то, что я хочу.

Каков наилучший способ сделать это без перегрузки базы данных? Я видел своего рода подзапрос, где вы используете "WHERE NOT EXISTS ()"

Я просто хочу знать наиболее эффективный способ вставки записи, чтобы не было дубликатов одной и той же записи.

Заранее спасибо!

Ответы [ 4 ]

3 голосов
/ 02 апреля 2009

Вы знаете, как создать уникальный индекс для столбца.

Просто сделайте это для всех столбцов, которые вместе должны быть уникальными:

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

Обратите внимание, что необходимость сделать это может указывать на то, что ваша таблица недостаточно нормализована.

1 голос
/ 02 апреля 2009

Вы можете добавить уникальное ограничение к определению таблицы и включить все столбцы (за исключением первичного ключа, я полагаю). Уникальные ограничения создают индексы, поэтому я не знаю, какое влияние это может оказать на производительность, но я предполагаю, что чем меньше столбцов, тем лучше.

Это добавит такое ограничение к существующей таблице:

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

Обратите внимание, что существуют определенные ограничения на типы столбцов и т. Д., Так что это может работать, а может и не работать для вашей таблицы. См. Книги в Интернете для получения подробной информации: http://msdn.microsoft.com/en-us/library/ms177420(sql.90).aspx

0 голосов
/ 26 августа 2009

Ваш вопрос был довольно ясен (не знаю, почему другие ответили тем, что вы специально хотели исключить), и тем, что я потратил более часа, пытаясь найти ...

Эта ссылка была наиболее полезной 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>
0 голосов
/ 02 апреля 2009

Вы можете сделать:

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)

Запустите нижнюю половину дважды, и она не вставит запись более одного раза.

...