SQL Server消息547

时间:2015-10-19 22:43:58

标签: sql sql-server check-constraints

我想让Kode_Barang 7个角色与第一个角色必须' B'剩下的字符必须是数字[1-9]

我为此创建了Kode_Barang查询:

Kode_Barang CHAR(7) PRIMARY KEY CHECK(LEN(Kode_Barang)=7 AND LEFT(Kode_Barang,1)='B' AND SUBSTRING(Kode_Barang,2,6)LIKE '[0-9]' )

但在我插入一些像这样的值之后:

INSERT INTO Barang (Kode_Barang, Nama_Barang, Satuan, Harga, Stock) 
VALUES('B000001', 'Mie Goreng', 'Biji', 2500, 56)

Kode_Barang发生错误。

有什么不对吗?请查看带有检查约束的SQL查询。

注意另一个参考:

Nama_Barang VARCHAR(25) UNIQUE NOT NULL,
Satuan VARCHAR (10) CHECK(Satuan = 'Buah' OR Satuan = 'Biji' OR Satuan  = 'CM' OR Satuan = 'KG' OR Satuan = 'DUS' OR Satuan = 'Lusin'),
Harga MONEY NOT NULL CHECK(Harga != 0)
Stock INT NOT NULL CHECK(Stock > -1)

由于

我已经尝试过'%[^ 0-9]%'但结果仍然相同

我得到像这样的参考 How can I use LEFT & RIGHT Functions in SQL to get last 3 characters?

我的数据类型为CHAR而不是VARCHAR

我改变了这样的代码:

Kode_Barang CHAR(7) PRIMARY KEY 
     CHECK(LEN(Kode_Barang) = 7 
           AND SUBSTRING(CAST(Kode_Barang AS VARCHAR(7)), 1, 1) = 'B' 
           AND SUBSTRING(CAST(Kode_Barang AS VARCHAR(7)), 2, 6) LIKE '%[^0-9]%' ),

但仍然相同

错误:

  

Msg 547,Level 16,State 0,Line 44
  INSERT语句与CHECK约束" CK__Barang__Kode_Bar__5441852A"冲突。冲突发生在数据库" Studi_Kasus_Kelompok",table" dbo.Barang",column' Kode_Barang'。

由于

2 个答案:

答案 0 :(得分:1)

我说你的SUBSTRING(Kode_Barang, 2, 6) LIKE '[0-9]'是错的。 LIKE '[0-9]'将与单个数字进行比较。也许尝试类似的事情:

... SUBSTRING(Kode_Barang, 2, 6) NOT LIKE '%[^0-9]%' ...

...检查结果字符串中的是否 数字。

答案 1 :(得分:1)

您的CHECK约束应该是:

CHECK(Kode_Barang LIKE 'B[0-9][0-9][0-9][0-9][0-9][0-9]')

这意味着Kode_Barang应该是以B开头的7个字符,其余字符是数字。