emp_id
像1,2,3,4...那样自动递增first_name
和 last_name
仅允许第一个字母为大写的输入。创建了一个表:
CREATE TABLE employee(
emp_id INT PRIMARY KEY IDENTITY(0,1) NOT NULL,
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
);
插入第一轮值:
INSERT INTO employee(first_name, last_name, birth_date, sex, salary)
VALUES ('David', 'Wallace', '1967-11-17', 'M', 250000);
emp_id
设置为5,我原本打算将其设置为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,
我尝试确保 first_name
和 last_name
的第一个字母是大写的。相反,这些列只允许输入 1 个大写字母,通过将 ('David', 'Wallace', '1967-11-17', 'M', 250000);
更改为 ('D', 'W', '1967-11-17', 'M', 250000);
进行测试。有什么帮助吗?在成功插入之前,很可能发生多次失败、回滚或服务中断。 SQL Server 不跟踪插入是否成功;无论如何它都会耗尽身份值。它会缓存一定数量的值,以便您可以并且会随着时间的推移看到序列中的间隙(IIRC 有一个跟踪标志可以覆盖它,但只是不这样做)。
对此采取什么措施取决于所需的行为。
ROW_NUMBER()
即可。下一个:
CHECK(first_name LIKE UPPER(LEFT(first_name,1)))
这意味着任何字符串 > 一个字符都会失败,因为您说的是“输入的值是
LIKE
输入值的第一个字符(当没有通配符时,LIKE
与 =
相同)。您是否想确保第一个字母始终大写?为什么?如果我的姓氏是da Costa
,那么在某些文化中,小写很重要,那么您需要检查一下。使用区分大小写或二进制的排序规则,例如:
CHECK (LEFT(first_name,1) COLLATE Latin1_General_100_BIN
= UPPER(LEFT(first_name, 1))
请注意,这也允许
Da costa
,这也可能不是有意或无意的。