Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Инструкцията ALTER TABLE е в конфликт с ограничението CHECK в SQL Server - SQL Server / TSQL Урок, част 89

Сценарий:

Вие работите като разработчик на SQL Server, от вас се иска да добавите Check Constraint към една съществуваща таблица dbo.Employee в колона FName и да напишете логика за Check Constraint, така че винаги да приема азбуки.

Когато се опитате да добавете контролно ограничение, получихте грешка по-долу.

Съобщение 547, ниво 16, състояние 0, ред 19
Изразът ALTER TABLE е в конфликт с ограничението CHECK "Chk_dbo_Employee_FName".
Конфликтът възникна в база данни „YourDatabaseName“, таблица „dbo.Employee“, колона „FName“.

Решение:

Нека първо генерираме сценария за грешката. Създайте примерна таблица dbo.Employee с някои примерни данни.
--Create Table  
use YourDatabaseName
go
Create table dbo.Employee
(
FName VARCHAR(100) Not Null,
LName VARCHAR(100),
StreetAddress VARCHAR(255)
)
--Insert data in sql table
insert into dbo.Employee(FName,LName,StreetAddress)
values ('Aamir','Shahzad','xyz address')
go
insert into dbo.Employee(FName,LName,StreetAddress)
values ('Raza A',Null,'abc address')
go
 
Сега изпълнете оператора alter table, за да добавите Check Constraint. След като изпълните този оператор, ще получите горната грешка. тъй като съществуващите данни не отговарят на изискванията за проверка на ограничението. Имаме място в първото име за „Raza A“ и нашето ограничение за проверка казва, че данните във FName трябва винаги да са азбучни.
Alter table dbo.Employee
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%')
 
 
 1) Първо решение:Може да коригирате съществуващото решение DataFist, да намерите данните, които не отговарят на изискванията за проверка на ограничението и да ги коригирате и след това да добавите проверка на ограничението.
2) Ако бизнесът не иска да коригира съществуващите данни и ако искате да приложите Check Constraint от движение напред, можете да създадете Check Constraint с Nocheck. Правейки това, няма да потвърди съществуващите данни спрямо нашето правило за проверка на ограничението, а ще се приложи само към нови данни.
Alter table dbo.Employee with nocheck
Add Constraint Chk_dbo_Employee_FName
Check (FName not like '%[^a-z]%') 
 
 
 Нека вмъкнем няколко записа и да проверим дали нашето ограничение работи както се очаква.
insert into dbo.Employee(FName,LName,StreetAddress)
values ('Test 123',Null,'test address')
go

insert into dbo.Employee(FName,LName,StreetAddress)
values ('Najaf',Null,'test address')
go
 
 
 Първото вмъкване ще се провали, тъй като не отговаря на изискванията на нашето правило за проверка на ограничението. Вторият запис ще бъде вмъкнат успешно. Нека сега проверим данните в таблицата.
Как да добавите ограничение за проверка към колона със съществуващи данни в SQL Server

Видео демонстрация:Как да коригирате грешка, изразът Alter table е в конфликт с ограничението за проверка


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какъв е най-добрият начин да тествате програмно връзката със SQL Server?

  2. Пагинация в SQL Server с помощта на OFFSET/FETCH

  3. Как да проверите дали съществува съхранена процедура, преди да я създадете

  4. Проверете неизпратена поща в SQL Server (T-SQL)

  5. Отстраняване на проблеми с репликацията на SQL сървър