为什么我要使用两个步骤创建表?

时间:2018-04-18 13:16:57

标签: sql-server database rdbms

创建表并在两个步骤中给出默认值是否有用?首先使用CREATE TABLE,然后使用每个列的ALTER TABLE。这只是格式化首选项的问题?或者是否有更多技术原因可以做到这一点?

我的地方有一些创建表脚本,如下所示:

CREATE TABLE [dbo].[TABLE_EXISTING](
    [SYS_ID] [varchar](17) NULL,
    [TYPE] [varchar](35) NULL,
    [CODE] [varchar](12) NULL
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[TMG_ITS_PROF_INST_REC_T] ADD  DEFAULT (space((17))) FOR [SYS_ID]
GO

ALTER TABLE [dbo].[TMG_ITS_PROF_INST_REC_T] ADD  DEFAULT (space((35))) FOR [TYPE]
GO

ALTER TABLE [dbo].[TMG_ITS_PROF_INST_REC_T] ADD  DEFAULT (space((12))) FOR [CODE]
GO

为什么或为什么我不应该继续创建像这样的新表:

CREATE TABLE [dbo].[TABLE_NEW](
    [SYS_ID] [varchar](17) NULL DEFAULT space(17),
    [TYPE] [varchar](35) NULL DEFAULT space(35),
    [CODE] [varchar](12) NULL DEFAULT space(12)
) ON [PRIMARY]

3 个答案:

答案 0 :(得分:8)

你绝对可以使用"内联"使用表创建默认约束的样式。我实际上更喜欢它,因为在我看来,它使更清晰哪些位属于一起 - 但与此同时,表定义变得更复杂,更复杂。

但是我总是建议命名你的约束!

CREATE TABLE [dbo].[TABLE_NEW]
(
    [SYS_ID] [VARCHAR](17) NULL 
        CONSTRAINT DF_TableNew_SysId DEFAULT space(17),
    [TYPE] [VARCHAR](35) NULL 
        CONSTRAINT DF_TableNew_Type DEFAULT space(35),
    [CODE] [VARCHAR](12) NULL 
        CONSTRAINT DF_TableNew_Code DEFAULT space(12)
)

因为如果您需要处理约束(禁用或删除它),除非您明确地将其命名,否则它将具有一个很好的,非常反直觉的系统提供的名称,这通常会导致头痛和麻烦。 名称您的约束!

答案 1 :(得分:0)

我更喜欢在创建脚本中一次完成所有操作。我假设在最初创建表之后添加了更改。脚本保持独立,因此可以根据需要更新所有环境。

答案 2 :(得分:0)

SQL Server管理工作室似乎以这种方式生成表创建更改脚本,也许这就是为什么它们采用这种格式:

CREATE TABLE dbo.Table_1
    (
    Id int NOT NULL,
    Name nvarchar(50) NOT NULL,
    Surname nvarchar(50) NOT NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT
    DF_Table_1_Name DEFAULT N'Foo' FOR Name
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT
    DF_Table_1_Surname DEFAULT N'bar' FOR Surname
GO
ALTER TABLE dbo.Table_1 SET (LOCK_ESCALATION = TABLE)
GO
COMMIT