我正在尝试在一个脚本中创建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'。
有没有办法在一个脚本中执行此操作?
答案 0 :(得分:2)
你应该引用ImageId
而不是像这样的约束名PK_ImageId
-
CONSTRAINT FK_MainImageId FOREIGN KEY (MainImageId) REFERENCES [Image] (ImageId)
并在两个批处理语句之间尝试GO。立即执行它们。
答案 1 :(得分:0)
尝试在第一次查询后添加“GO”。我认为这应该有用。
答案 2 :(得分:0)
在一个脚本中,只需在两个操作之间放置一个GO。这将脚本分为两批。 GO是SSMS和其他一些工具支持的批处理分隔符,如SQLCMD。