SQL Server中IDENTITY起始值异常与首字母大写约束问题求助
SQL Server 两个问题的解决办法
一、IDENTITY自增起始值异常(首条数据emp_id为5)
原因
标识列的种子值可能因之前的插入、删除操作,或数据库重启时的缓存问题,导致当前标识值被跳过,无法按预期从0/1开始。
解决步骤
- 查看当前表的标识值状态,确认异常情况:
DBCC CHECKIDENT('employee', NORESEED);
执行后会返回当前标识种子和当前标识值,验证是否偏离预期。
- 重置标识种子,让下一条插入的emp_id从1开始:
DBCC CHECKIDENT('employee', RESEED, 0);
因为表设置的是IDENTITY(0,1),重置种子为0后,下一次插入的记录会自动使用1作为emp_id。如果后续希望默认从1开始自增,也可以删除表后重新创建,将IDENTITY(0,1)改为IDENTITY(1,1)。
二、首字母大写CHECK约束无法插入正常姓名
原因
原约束CHECK (first_name LIKE UPPER(LEFT(first_name, 1)))仅校验了首字母,但未允许后续字符存在——LIKE默认匹配完全等于首字母的字符串,因此只能输入单个大写字母,无法插入完整姓名。
解决步骤
方法1:重新创建表(适合表中无数据的场景)
修改CHECK约束,在首字母后添加%以匹配任意后续字符:
CREATE TABLE employee ( emp_id INT PRIMARY KEY IDENTITY(1,1) NOT NULL, -- 直接设置从1开始自增 first_name VARCHAR(20) CHECK (first_name LIKE UPPER(LEFT(first_name, 1)) + '%') NOT NULL, last_name VARCHAR(40) CHECK(last_name LIKE UPPER(LEFT(last_name, 1)) + '%') NOT NULL, birth_date DATE NOT NULL, sex char(1) CHECK (sex IN ('M','F')) NOT NULL, salary MONEY NOT NULL, super_id INT DEFAULT NULL, branch_id INT DEFAULT NULL );
方法2:修改已有表的约束(适合表中已有数据的场景)
- 查询原约束的名称:
SELECT name FROM sys.check_constraints WHERE parent_object_id = OBJECT_ID('employee');
找到对应first_name和last_name的约束名称(格式类似CK__employee__first___XXXXXX)。
- 删除旧约束:
ALTER TABLE employee DROP CONSTRAINT CK__employee__first___XXXXXX; -- 替换为实际约束名 ALTER TABLE employee DROP CONSTRAINT CK__employee__last___XXXXXX; -- 替换为实际约束名
- 添加新的正确约束:
ALTER TABLE employee ADD CONSTRAINT CK_employee_first_name CHECK (first_name LIKE UPPER(LEFT(first_name, 1)) + '%'); ALTER TABLE employee ADD CONSTRAINT CK_employee_last_name CHECK (last_name LIKE UPPER(LEFT(last_name, 1)) + '%');
验证插入
修改完成后,执行插入语句:
INSERT INTO employee(first_name, last_name, birth_date, sex, salary) VALUES ('David', 'Wallace', '1967-11-17', 'M', 250000);
此时可正常插入数据,且emp_id会从1开始自增。
内容的提问来源于stack exchange,提问作者Jakub Mikołajczak
相关产品推荐
相关产品推荐

