创建数据库脚本,其中表已跨环境预填充数据
Create database scripts where tables have prepopulated data across environment
我有一个名为“[UserTypes]”的 table,其中主要 ID 是 [uniqueidentifier]
。我在另一个名为“[Users]”的 table 中有一个参考。 Users
table 有 UserTypeId
作为外键。
CREATE TABLE [UserTypes] (
[Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
[UserName] [varchar](100) NOT NULL,
[UserCD] [varchar](40) NOT NULL
GO
INSERT INTO [dbo].[UserTypes]
([UserName], [UserCD])
VALUES
('Administrator','ADMI'),
('NonPrimary','NONP'),
GO
-- ID got generated in [UserTypes] is '80D1EEE7-0BCC-48A7-A741-29A1D8B6E580' for 'ADMI'
CREATE TABLE [Users] (
[Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
[UserTypeId] [uniqueidentifier] NOT NULL,
[UserName] [varchar](100) NOT NULL,
CONSTRAINT Users_UserTypeId_UserType_Id FOREIGN KEY (UserTypeId)
REFERENCES UserTypes(Id))
GO
INSERT INTO [dbo].[Users]
([UserTypeId], [UserName])
VALUES
('80D1EEE7-0BCC-48A7-A741-29A1D8B6E580','Kushal Seth')
GO
此 '80D1EEE7-0BCC-48A7-A741-29A1D8B6E580'
是来自 Table 的 'ADMI' 的 userTypeId。
我的问题是,假设我需要在一个新的数据库中运行这个脚本,那么我的'ADMI'的ID在'UserTypes' table。并且脚本将在插入 'Users' table.
时抛出错误
我有一个选择是声明变量和 select 来自 UserType Table 的 ID 并分配给这个变量,然后在 [Users] [=32] 的插入查询中使用它=].
这是唯一的方法吗?或者有没有更好的方法来设计这样的 tables。任何设计建议将不胜感激。
Suppose, I need to run this script in a new DB, then my ID for 'ADMI' will be different in 'UserTypes' table.
因此从 UserTypes 中删除 Guid PK,并使 'UserCD' 成为主键。
CREATE TABLE [UserTypes]
(
[UserCD] [varchar](40) NOT NULL PRIMARY KEY,
[UserName] [varchar](100) NOT NULL
)
GO
INSERT INTO [dbo].[UserTypes]
([UserName], [UserCD])
VALUES
('Administrator','ADMI'),
('NonPrimary','NONP')
哪个更好。
如果您有分布式数据服务器,即使它们没有永久连接也必须保持唯一性,Guid 非常有用。
但是你可以做下面的,因为你知道uusercd是ADMI,你可以抓到ID
CREATE TABLE [UserTypes] (
[Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
[UserName] [varchar](100) NOT NULL,
[UserCD] [varchar](40) NOT NULL)
INSERT INTO [dbo].[UserTypes]
([UserName], [UserCD])
VALUES
('Administrator','ADMI'),
('NonPrimary','NONP')
GO
-- ID got generated in [UserTypes] is '80D1EEE7-0BCC-48A7-A741-29A1D8B6E580' for 'ADMI'
CREATE TABLE [Users] (
[Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
[UserTypeId] [uniqueidentifier] NOT NULL,
[UserName] [varchar](100) NOT NULL,
CONSTRAINT Users_UserTypeId_UserType_Id FOREIGN KEY (UserTypeId)
REFERENCES UserTypes(Id))
INSERT INTO [dbo].[Users]
([UserTypeId], [UserName])
VALUES
((SELECT [Id] FROM [UserTypes] WHERE [UserCD] = 'ADMI'),'Kushal Seth')
SELECT * FROM Users
GO
Id | UserTypeId | UserName
:----------------------------------- | :----------------------------------- | :----------
53f2a6e0-af71-4dab-8a99-821510681a37 | 6acfc89f-f4e2-4ac1-9989-b3a9c062cf0a | Kushal Seth
db<>fiddle here
我有一个名为“[UserTypes]”的 table,其中主要 ID 是 [uniqueidentifier]
。我在另一个名为“[Users]”的 table 中有一个参考。 Users
table 有 UserTypeId
作为外键。
CREATE TABLE [UserTypes] (
[Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
[UserName] [varchar](100) NOT NULL,
[UserCD] [varchar](40) NOT NULL
GO
INSERT INTO [dbo].[UserTypes]
([UserName], [UserCD])
VALUES
('Administrator','ADMI'),
('NonPrimary','NONP'),
GO
-- ID got generated in [UserTypes] is '80D1EEE7-0BCC-48A7-A741-29A1D8B6E580' for 'ADMI'
CREATE TABLE [Users] (
[Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY,
[UserTypeId] [uniqueidentifier] NOT NULL,
[UserName] [varchar](100) NOT NULL,
CONSTRAINT Users_UserTypeId_UserType_Id FOREIGN KEY (UserTypeId)
REFERENCES UserTypes(Id))
GO
INSERT INTO [dbo].[Users]
([UserTypeId], [UserName])
VALUES
('80D1EEE7-0BCC-48A7-A741-29A1D8B6E580','Kushal Seth')
GO
此 '80D1EEE7-0BCC-48A7-A741-29A1D8B6E580'
是来自 Table 的 'ADMI' 的 userTypeId。
我的问题是,假设我需要在一个新的数据库中运行这个脚本,那么我的'ADMI'的ID在'UserTypes' table。并且脚本将在插入 'Users' table.
时抛出错误我有一个选择是声明变量和 select 来自 UserType Table 的 ID 并分配给这个变量,然后在 [Users] [=32] 的插入查询中使用它=].
这是唯一的方法吗?或者有没有更好的方法来设计这样的 tables。任何设计建议将不胜感激。
Suppose, I need to run this script in a new DB, then my ID for 'ADMI' will be different in 'UserTypes' table.
因此从 UserTypes 中删除 Guid PK,并使 'UserCD' 成为主键。
CREATE TABLE [UserTypes]
(
[UserCD] [varchar](40) NOT NULL PRIMARY KEY,
[UserName] [varchar](100) NOT NULL
)
GO
INSERT INTO [dbo].[UserTypes]
([UserName], [UserCD])
VALUES
('Administrator','ADMI'),
('NonPrimary','NONP')
哪个更好。
如果您有分布式数据服务器,即使它们没有永久连接也必须保持唯一性,Guid 非常有用。
但是你可以做下面的,因为你知道uusercd是ADMI,你可以抓到ID
CREATE TABLE [UserTypes] ( [Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY, [UserName] [varchar](100) NOT NULL, [UserCD] [varchar](40) NOT NULL)
INSERT INTO [dbo].[UserTypes] ([UserName], [UserCD]) VALUES ('Administrator','ADMI'), ('NonPrimary','NONP')
GO
-- ID got generated in [UserTypes] is '80D1EEE7-0BCC-48A7-A741-29A1D8B6E580' for 'ADMI' CREATE TABLE [Users] ( [Id] [uniqueidentifier] DEFAULT NEWID() PRIMARY KEY, [UserTypeId] [uniqueidentifier] NOT NULL, [UserName] [varchar](100) NOT NULL, CONSTRAINT Users_UserTypeId_UserType_Id FOREIGN KEY (UserTypeId) REFERENCES UserTypes(Id))
INSERT INTO [dbo].[Users] ([UserTypeId], [UserName]) VALUES ((SELECT [Id] FROM [UserTypes] WHERE [UserCD] = 'ADMI'),'Kushal Seth')
SELECT * FROM Users GO
Id | UserTypeId | UserName :----------------------------------- | :----------------------------------- | :---------- 53f2a6e0-af71-4dab-8a99-821510681a37 | 6acfc89f-f4e2-4ac1-9989-b3a9c062cf0a | Kushal Seth
db<>fiddle here