добавить ограничение CHECK в уже заполненную таблицу

Я создал таблицу с именем test со столбцом с именем code:

create table test(  
code char(3) not null);

Затем я заполнил таблицу следующими данными:

insert into test values ('A12');
insert into test values ('B23');
insert into test values ('C45');

Затем я изменил столбец, чтобы сделать его char (4):

alter table test
alter column code char(4) not null;

Затем я добавил «X» ко всем существующим данным, чтобы они стали длиной 4 символа:

update test
  set code='X'+code
where LEN(code)=3;

Пока все хорошо, но потом, когда я попытался добавить контрольное ограничение:

alter table test
add constraint codeCheck check (code like 'A-Z''A-Z''0-9''0-9');

Я получил эту ошибку:

The ALTER TABLE statement conflicted with the CHECK constraint "codeCheck".

Я понимаю, что ошибка подразумевает, что существующие данные нарушают проверочное ограничение, которое я пытаюсь добавить в таблицу, но почему?

и как мне сделать так, чтобы существующие данные и контрольное ограничение не нарушали друг друга?


person j_t_fusion    schedule 27.09.2012    source источник
comment
Пожалуйста, используйте кнопку { }, а не HTML-разметку, чтобы отформатировать сообщение.   -  person Aaron Bertrand    schedule 27.09.2012


Ответы (3)


Синтаксис вашего шаблона неверен. Так должно быть

alter table test
add constraint codeCheck check (code like '[A-Z][A-Z][0-9][0-9]');
person Martin Smith    schedule 27.09.2012

Поскольку ваши данные не соответствуют подобному ограничению.

Пытаться

alter table test
     add constraint codeCheck check (code like '[A-Z][A-Z][0-9][0-9]' );
person podiluska    schedule 27.09.2012

Я не знаю, как это работает с SQL Server, но ваше подобное предложение выглядит странно. Попробуйте использовать

'[A-Z]{2}\d{2}'

person jpstrube    schedule 27.09.2012