SQL:在一个脚本中创建多个依赖表

时间:2011-04-08 17:08:36

标签: sql sql-server

我正在尝试在一个脚本中创建2个表。第一个是带有主键的图像表,第二个是带有链接到图像表id的外键的文章表。代码:

IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'Image')
        CREATE TABLE [Image]
        (
            [ImageId]                       INT IDENTITY(1,1)       NOT NULL,
            [FileName]                      NVARCHAR(20)            NOT NULL,
            [ImageData]                     VARBINARY(MAX)          NOT NULL,
            CONSTRAINT PK_ImageId PRIMARY KEY CLUSTERED (ImageId ASC)
            ON [PRIMARY]
        )

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'Article')
        CREATE TABLE Article
        (
            ArticleId                       INT IDENTITY(1,1)       NOT NULL,
            CreatedAt                       DATE                    NOT NULL
            CONSTRAINT D_ArticleDate DEFAULT GETDATE(),
            Title                           NVARCHAR(20)            NOT NULL,
            Body                            NVARCHAR(MAX)           NOT NULL,
            MainImageId                     INT                     NULL,
            CONSTRAINT PK_ArticleId PRIMARY KEY CLUSTERED (ArticleId ASC)
            ON [PRIMARY],
            CONSTRAINT FK_MainImageId FOREIGN KEY (MainImageId) REFERENCES [Image] (PK_ImageId)
        )

如果我运行Image查询,它运行正常。如果我然后运行文章查询它运行正常。如果我一次运行两个查询,我会收到以下错误:

外键'FK_MainImageId'引用引用表'Image'中的无效列'PK_ImageId'。

有没有办法在一个脚本中执行此操作?

3 个答案:

答案 0 :(得分:2)

你应该引用ImageId而不是像这样的约束名PK_ImageId -

CONSTRAINT FK_MainImageId FOREIGN KEY (MainImageId) REFERENCES [Image] (ImageId)

并在两个批处理语句之间尝试GO。立即执行它们。

答案 1 :(得分:0)

尝试在第一次查询后添加“GO”。我认为这应该有用。

答案 2 :(得分:0)

在一个脚本中,只需在两个操作之间放置一个GO。这将脚本分为两批。 GO是SSMS和其他一些工具支持的批处理分隔符,如SQLCMD。