SQL таблица снова и снова принимает одни и те же имена - PullRequest
1 голос
/ 17 июня 2011

Я пытаюсь вставить имя типа гостевого прохода в таблицу guestpasstypes и одновременно проверяет базу данных, имеет ли база данных это имя, или нет, используя этот оператор:

@"INSERT INTO guestpasstypes(guestPasstype_Name)values('" + tbPassType.Text + "') where not exists (select 'guestPasstype_Name' from guestpasstypes where guestPasstype_Name = '" + tbPassType.Text + "')"

но он также принимает дублированное имя и не работает. Кто-нибудь, пожалуйста, помогите в этом?

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

Для SQL Server это будет выглядеть следующим образом.

insert into guestpasstypes (guestPasstype_Name)
select 'name1'
where not exists (select *
                  from guestpasstypes
                  where guestPasstype_Name = 'name1')

Я думаю, что это должно работать и для MySQL.

Если вы используете SQL Server 2008, вы можете использовать MERGE .

merge guestpasstypes as G
using (select 'name2') as S(Name)
on G.guestPasstype_Name = S.Name
when not matched then
  insert (guestPasstype_Name) values (Name);

UPDATE

Я думаю, что первый вариант может быть применен к вашей проблеме следующим образом:

@"INSERT INTO guestpasstypes(guestPasstype_Name) select '" + tbPassType.Text
  + "' where not exists (select * from guestpasstypes where guestPasstype_Name = '"
  + tbPassType.Text + "')"
1 голос
/ 17 июня 2011

Если вы хотите, чтобы он выдал ошибку, вы можете:

  • Поместить уникальный индекс в столбец (самый простой и предпочтительный способ)

или

  • Напишите хранимую процедуру, которая возвращает флаг ошибки. В рамках процедуры вы сначала проверяете соответствие значению и, если оно найдено, устанавливаете флаг ошибки и возвращаетесь. В противном случае выполните вставку как обычно.
0 голосов
/ 17 июня 2011

Попробуйте либо INSERT IGNORE, либо INSERT ON DUPLICATE KEY:

INSERT IGNORE INTO `guestpasstypes`(`guestPasstype_Name`) values('" + tbPassType.Text + "');

ИЛИ

INSERT INTO `guestpasstypes`(`guestPasstype_Name`)values('" + tbPassType.Text + "') ON DUPLICATE KEY UPDATE `guestPasstype_Name` = `guestPasstype_Name`;
...