创建表设置联合唯一约束,插入重复数据未报错原因咨询
唯一键约束未触发报错的可能原因
1. 建表语句语法错误导致约束未被创建
你的建表语句存在语法问题:create table table1的定义括号在account_code char(4) not null后就闭合了,后续的constraint ak_table1 unique (routing_identifier, account_code)并未包含在表的定义块内。多数数据库(如SQL Server)会将这部分代码视为独立的无效语句,不会将该唯一键约束绑定到table1上。
你可以通过查询系统元数据验证约束是否存在,比如在SQL Server中执行:
SELECT * FROM sys.key_constraints WHERE name = 'ak_table1';
如果查询无结果,说明该约束根本没被创建。正确的建表写法应该把约束放在表定义的括号内:
create table table1 ( table_identifier integer identity, routing_identifier integer not null, account_code char(4) not null, constraint pk_table1 primary key (table_identifier), constraint ak_table1 unique (routing_identifier, account_code) );
2. char(4)类型的空格填充导致视觉重复但实际值不同
char(4)是固定长度字符类型,数据库会自动用空格填充至4位。如果你的测试数据存在以下情况,会导致视觉上看似重复,但实际存储值不同:
- 插入的字符串前导空格不同,比如
'1234'和' 123'(后者补空格后为' 123 ') - 插入的字符串被客户端截断显示,比如实际存储的
'123 '尾部有空格,但查询时客户端自动去掉空格,让你误以为和'123'重复
你可以用包含空格检查的查询验证:
SELECT routing_identifier, account_code, LEN(account_code), DATALENGTH(account_code) FROM table1;
DATALENGTH会返回实际字节数,char(4)的正常返回值是4,如果出现不一致说明内容存在差异。
3. 约束被禁用或删除
如果之前该约束被手动禁用或删除,插入重复数据时自然不会触发报错。你可以查询约束的状态,比如在SQL Server中:
SELECT name, is_disabled FROM sys.key_constraints WHERE name = 'ak_table1';
如果is_disabled为1,说明约束被禁用。
内容的提问来源于stack exchange,提问作者tula_fan
相关产品推荐
相关产品推荐

