如何在CREATE TABLE查询中命名NOT NULL约束

时间:2018-01-07 21:01:34

标签: sql postgresql constraints

明天的测试,我们被告知命名我们的约束 我知道在使用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

3 个答案:

答案 0 :(得分:3)

您有两个选项来定义命名非空约束:

内联列:

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)
);

答案 1 :(得分:0)

由于您没有使用SQL Server ,因此无关紧要 首先,总是VARCHAR指定长度。不这样做(在SQL Server变量或参数中)可能会导致字符串长度恰好是一个字符 - 通常你想要的。 < / p>

然后,您只需指定NOT NULL - 无需重复列名称(实际上这是错误) - 如果您使用列指定CONSTRAINT“内联”定义(这是完全合法的,在我看来是这样做的首选方式)。

试试这段代码:

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

至少这是在T-SQL / SQL Server中有效的CREATE TABLE语句 - 不确定PostgreSQL(不太了解它,现在没有它可以立即测试)。

答案 2 :(得分:0)

I,a_horse_with_no_name,两种语法:

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

是等效的吗?性能正确。 因为在第一种情况下,SQL Server异常返回名称 nn_test ,所以系统确切知道错误。