【问题标题】:How to name NOT NULL constraint in CREATE TABLE query如何在 CREATE TABLE 查询中命名 NOT NULL 约束
【发布时间】:2018-01-07 21:01:33
【问题描述】:

对于明天的测试,我们被告知要命名我们的约束 我知道使用 ALTER TABLE 时可以创建约束 但是在 CREATE TABLE 时可以为非空约束添加名称吗?

f.e.

CREATE TABLE test (
    test1 VARCHAR 
    CONSTRAINT nn_test1 NOT NULL (test1)
)

尝试运行此查询时出现错误。我写错了吗?

我得到的错误是

ERROR:  syntax error at or near "NOT"   
LINE 3: CONSTRAINT nn_test1 NOT NULL (test1))  
                            ^
SQL state: 42601  
Character: 56

【问题讨论】:

  • 你在 varchar 后面缺少一个 ',':test1 VARCHAR, CONSTRAINT nn_test1 NOT NULL (test1)
  • 你是对的,但即使使用逗号,我也会收到一个错误,指出错误发生在“NOT”附近。我正在使用 PGadmin 4

标签: sql postgresql constraints


【解决方案1】:

你有两个选项来定义一个命名的非空约束:

与列内联:

CREATE TABLE test 
(
   test1 VARCHAR CONSTRAINT nn_test1 NOT NULL, 
   test2 integer --<< no comma because it's the last column
);

或在列的末尾作为线外约束。但是你需要一个检查约束:

CREATE TABLE test 
(
   test1 VARCHAR, 
   test2 integer, --<< comma required after the last column
   constraint nn_test1 check (test1 is not null)
);

【讨论】:

    【解决方案2】:

    这已经无关紧要了,因为您没有使用 SQL Server
    首先,您应该始终指定 长度 为VARCHAR。不这样做(在 SQL Server 变量或参数中)可能会导致长度为恰好一个字符的字符串 - 通常不是您想要的。

    然后,您只需指定 NOT NULL - 无需重复列名(实际上这是错误) - 如果您在列定义中指定 CONSTRAINT "inline"(即一种完全合法的方式,在我看来是首选方式)。

    试试这个代码:

    CREATE TABLE test 
    (
        test1 VARCHAR(50) 
            CONSTRAINT nn_test1 NOT NULL
    )
    

    至少这是在 T-SQL / SQL Server 中工作的 CREATE TABLE 语句 - 不确定 PostgreSQL(不太了解它,现在手头没有测试)。

    【讨论】:

      【解决方案3】:

      我,a_horse_with_no_name,两种语法:

      约束 nn_test1 检查(test1 不为空)test1 VARCHAR 约束 nn_test1 NOT NULL

      是等价的吗?性能正确 ecc。 因为在第一种情况下,SQL 服务器异常返回名称 nn_test,因此系统可以准确地知道错误。

      【讨论】:

        猜你喜欢
        • 2021-12-02
        • 1970-01-01
        • 1970-01-01
        • 2016-09-19
        • 2017-03-01
        • 2017-09-21
        • 2023-03-11
        • 1970-01-01
        • 2015-04-22
        相关资源
        最近更新 更多