【问题标题】:Cannot define PRIMARY KEY constraint on nullable column in table 'tp_ladder'无法在表 'tp_ladder' 中的可空列上定义 PRIMARY KEY 约束
【发布时间】:2021-07-26 09:43:21
【问题描述】:

我正在尝试运行以下 SQL 语句

--dropping customer TABLE--
DROP TABLE tp_ladder;

--creating ladder TABLE
CREATE TABLE tp_ladder (
    ladder_id         INTEGER,
    ladder_type       VARCHAR(50),
    ladder_name       VARCHAR(50) NOT NULL,
    ladder_discount   DECIMAL(3,2),
    ladder_price      DECIMAL(8,2) NOT NULL,
    ladder_weight     DECIMAL(5,2),
    ladder_height     DECIMAL(5,2),
    ladder_rating     DECIMAL(10,2),
    warehouse_id      INTEGER    
);

--creating primary key for ladder table
ALTER TABLE tp_ladder

ADD CONSTRAINT tp_ladder_ladder_id
PRIMARY KEY(ladder_id);

但是我收到错误消息:

无法在表 'tp_ladder' 中的可空列上定义 PRIMARY KEY 约束

有什么建议吗?

【问题讨论】:

  • MySQL != SQL Server - 请更正您的标签。说真的,不要在你的列名前加上表名(梯形图)——你只是在为自己创造更多的输入而没有任何好处。
  • 你为什么要让你的 PK 为空?这可能是一个设计缺陷。
  • 这能回答你的问题吗? Cannot add primary key
  • 错误信息有什么不清楚的地方?您需要将ladder_id 定义为not null
  • @HANA 。 . .有趣。这似乎是 SQL Server 的限制(它适用于其他数据库)——考虑到 SQL Server 如何表示 NULL 值并且该表没有数据,我有点惊讶。相反,只需在表 ladder_id INTEGER PRIMARY KEY 中内联定义约束。

标签: sql sql-server ddl


【解决方案1】:

错误很清楚,但为什么是错误并不明显。

其他数据库(如 MySQL 和 Postgres)确实允许您做任何您想做的事情——在未明确声明为 NOT NULL 的列上添加主键。毕竟,PRIMARY KEY 也施加了NOT NULL 约束。这是令人惊讶的,尤其是在一张空桌子上。所以,错误并不明显。

此外,SQL Server 存储所有列的空标志,即使是声明为NOT NULL 的那些。因此,即使有数据,也不需要更改数据(假设没有 NULL 值)。并非所有数据库都以相同的方式存储 NULL 标志。

如果您已定义表,则可以使用以下方法修改列:

ALTER TABLE tp_ladder ALTER COLUMN ladder_id INT NOT NULL

这将允许您添加主键约束。

但是,我建议您在创建表时直接进行:

ladder_id INT PRIMARY KEY

请注意,在CREATE TABLE 中定义时,NOT NULL 是不需要的(实际上是多余的)。

【讨论】:

  • @BartHofland 。 . .那不是重点。主键永远不能是NULL。但是您可以在未声明为 NOT NULL 的列上添加主键。
  • 啊。现在我明白了。感谢您的澄清。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
相关资源
最近更新 更多