代码之家  ›  专栏  ›  技术社区  ›  Eli

创建表时声明默认约束

  •  94
  • Eli  · 技术社区  · 6 年前

    我在MicrosoftSQLServer2000中创建了一个新表,通过编写代码而不是使用GUI,我正在尝试学习如何“手动方式”完成它。

    这是我实际使用的代码,它运行良好:

    CREATE TABLE "attachments"
    (
        "attachment_id" INT NOT NULL,
        "load_date" SMALLDATETIME NOT NULL,
        "user" VARCHAR(25) NOT NULL,
        "file_name" VARCHAR(50) NOT NULL,
        CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
        CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
        CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE())
    )
    

    我自己指定了主键、外键和检查约束,因为这样我可以为它们定义一个名称,否则内联声明它们会使SQL Server生成一个随机名称,我不“喜欢”它。

    当我试图声明默认值约束时出现了问题:查看internet上的信息以及Microsoft SLQ Server Management Studio是如何创建的,我知道它可以内联创建,也可以自己创建:

    "load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()
    

    CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
    

    内联方法工作正常,但它像往常一样为constaint生成一个随机名称,而独立方法抛出一个错误,即 Incorrect syntax near 'FOR'.

    另外,如果我创建表,然后 ALTER 如果是这样,该命令将起作用:

    ALTER TABLE "attachments"
    ADD CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
    


    作为参考,以下是我尝试执行的完整代码:

    CREATE TABLE "attachments"
    (
        "attachment_id" INT NOT NULL,
        "load_date" SMALLDATETIME NOT NULL,
        "user" VARCHAR(25) NOT NULL,
        "file_name" VARCHAR(50) NOT NULL,
        CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
        CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
        CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE()),
        CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
    )
    



    我在这里完全不知所措,我想做的是不可能的,还是我做错了什么?


    编辑:

    1 回复  |  直到 8 年前
        1
  •  180
  •   David M    9 年前

    [load_date] SMALLDATETIME NOT NULL
            CONSTRAINT [df_load_date] DEFAULT GETDATE()
    

    我使用了方括号而不是引号,因为很多读者不会使用 QUOTED_IDENTIFIERS 默认情况下启用。