1。 SSMS - 在插入值 id 设置为 5 后,创建一个 id 为 IDENTITY(0,1) 的表。 2. 创建一个列来检查第一个字母是否大写

问题描述 投票:0回答:1

使用 Microsoft SQL Server Management Studio

  1. 想要
    emp_id
    像1,2,3,4...那样自动递增
  2. 希望
    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);
  1. 插入值后,
    emp_id
    设置为5,我原本打算将其设置为1。
  2. 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 sql-server ssms
1个回答
0
投票

在成功插入之前,很可能发生多次失败、回滚或服务中断。 SQL Server 不跟踪插入是否成功;无论如何它都会耗尽身份值。它会缓存一定数量的值,以便您可以并且会随着时间的推移看到序列中的间隙(IIRC 有一个跟踪标志可以覆盖它,但只是不这样做)。

对此采取什么措施取决于所需的行为。

  • 如果你只是不喜欢间隙,那就克服它;它们将会发生。身份不应该用于数字需要连续或具有实际意义的场景。它们是任意的替代值。
  • 如果您需要没有间隙,请停止使用身份。研究顺序和/或使用 HOLDLOCK 解决方案滚动您自己的 MAX+1。
  • 如果您在呈现数据时只关心数字是否有序,并且并不真正关心查询到查询中任何给定行的值是什么,则只需在呈现时应用
    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
,这也可能不是有意或无意的。

© www.soinside.com 2019 - 2024. All rights reserved.