【问题标题】:Sql Server create table queriesSql Server 创建表查询
【发布时间】:2015-02-15 12:29:07
【问题描述】:

我正在使用 Sql Server 迁移助手将我的数据库从 MySql 迁移到 SQL Server,并在学习 Sql Server 的过程中。

以下是自动生成架构的创建表语法。

CREATE TABLE [dbo].[TABLE1] (
    [COLUMN1] BIGINT IDENTITY (131556, 1) NOT NULL,
    [COLUMN2] INT CONSTRAINT [DF__TABLE_1__PRD_I__24E777C3] DEFAULT ((0)) NULL,
    [COLUMN3] INT CONSTRAINT [DF__TABLE1__PROMO__2AA05119] DEFAULT ((0)) NULL,
    CONSTRAINT [PK_TABLE1] PRIMARY KEY CLUSTERED ([COLUMN1] ASC)
);

GO
CREATE NONCLUSTERED INDEX [COLUMN3]
    ON [dbo].[TABLE1]([COLUMN3] ASC);

GO
EXECUTE sp_addextendedproperty @name = N'MS_SSMA_SOURCE', @value = N'TABLE1', 
@level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE',
@level1name = N'TABLE1';

我正在尝试理解和清理架构。有人可以帮助解决以下(天真的)问题吗?

  1. 为什么要将主键 (COLUMN1) 指定为 PRIMARY KEY CLUSTERED
  2. 在原始 MySql 表中,COLUMN3 被索引。 NONCLUSTERED INDEX 是否等同于 Sql Server?

    是什么意思

    创建非聚集索引 [COLUMN3] ON [dbo].[TABLE1]([COLUMN3] ASC);

  3. 我不明白以下内容:

    执行 sp_addextendedproperty @name = N'MS_SSMA_SOURCE',@value = N'TABLE1', @level0type = N'SCHEMA',@level0name = N'dbo',@level1type = N'TABLE', @level1name = N'TABLE1';

    有人能解释一下它的作用吗?

  4. 上述创建表语法是实现其功能的最小语法吗?
  5. MySql 表中有 131555 行。我是否应该在迁移数据后指定 IDENTITY (131556, 1) 以从 131556 开始自动递增密钥?

【问题讨论】:

    标签: sql sql-server database-migration


    【解决方案1】:

    1 和 2。您可能应该阅读关于聚集索引和非聚集索引之间差异的描述:http://msdn.microsoft.com/en-au/library/ms190457.aspx。简而言之,一张表只能有一个聚集索引,它定义了表中数据的排序顺序。一个表上可以有许多非聚集索引。

    1. SQL Server 允许您向对象添加扩展属性 - 有关详细信息,请参见此处:http://technet.microsoft.com/en-us/library/ms190243%28v=sql.105%29.aspx。基本上,它们用于存储有关对象的元数据——例如表的描述或列的输入掩码。

    2. 以下是创建表的完整语法:http://msdn.microsoft.com/en-AU/library/ms174979.aspx。我注意到您的示例是创建表并添加一些默认约束。您可以将其重写为

       CREATE TABLE [dbo].[TABLE1] 
       (
          [COLUMN1] BIGINT IDENTITY (131556, 1) NOT NULL,
          [COLUMN2] INT DEFAULT ((0)) NULL,
          [COLUMN3] INT NULL DEFAULT (0),
          CONSTRAINT [PK_TABLE1] PRIMARY KEY CLUSTERED ([COLUMN1] ASC)
      );
      
    3. 这实际上取决于您是否要保留现有的键值,我假设您会这样做。如果是这样,您应该使用

      插入数据

      SET IDENTITY_INSERT yourTable ON

    在此处了解身份列:http://msdn.microsoft.com/en-us/library/ms186775.aspx

    【讨论】:

      【解决方案2】:

      1.为什么要将主键(COLUMN1)指定为“PRIMARY KEY CLUSTERED”?

      通常每个 SQL Server 表最好都有一个聚集索引,并且每个表只允许一个聚集索引,因为聚集索引的 b 树叶节点是实际的数据页。支持主键的索引通常是最佳候选者,但如果这对您的特定情况有利,您可以使 PK 为非聚集索引,并使用与聚集索引不同的索引。例如,如果您对 COLUMN3 的最常见范围搜索的查询而不是按 COLUMN1 选择或连接的查询,则 COLUMN3 索引与非集群主键一起可能是更好的选择。

      2.在原始MySql表中,COLUMN3被索引。 NONCLUSTERED INDEX 是否等同于 Sql Server?什么意思

      非聚集索引也是 B 树索引,允许通过索引键定位行比表扫描更有效。

      3.我不明白以下内容:

      执行 sp_addextendedproperty @name = N'MS_SSMA_SOURCE',@value = N'TABLE1',@level0type = N'SCHEMA',@level0name = N'dbo',@level1type = N'TABLE', @level1name = N'TABLE1';

      有人能解释一下它的作用吗?

      SQL Server 有一个扩展属性功能,允许您将元数据附加到数据库对象。在这种情况下,SSMA 添加了一个扩展属性来指示该表是由该工具创建的。

      4.上面的创建表语法是实现其功能的最小语法吗?

      没有。例如,可以省略约束名称,SQL Server 会自动生成一个名称。但是,最佳实践是显式命名约束以促进后续 DDL 更改,从而实现自文档化。就个人而言,我会将默认约束命名为 DF_TABLENAME_COLUMNNAME。

      5.MySql 表中有 131555 行。我是否应该指定 IDENTITY (131556, 1) 以在之后从 131556 开始自动递增键 我迁移数据?

      如果您要使用 IDENTITY(1,1) 创建表,然后使用 IDENTITY INSERT ON 选项插入行,SQL Server 将根据插入的最大值自动调整下一个 IDENTITY。我对 SSMA 了解不多,但看起来 SSMA 已经为您做到了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-10
        • 2017-11-06
        • 1970-01-01
        • 2010-11-13
        • 2013-06-21
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        相关资源
        最近更新 更多