Sql Server创建表查询

时间:2014-12-17 02:29:39

标签: sql sql-server database-migration

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

以下是自动生成架构的create table语法。

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. 上面的create table语法是实现它的最小语法吗?
  5. 我的MySql表中有131555行。我是否应该指定IDENTITY (131556, 1)以在迁移数据后从131556开始自动增加密钥?

2 个答案:

答案 0 :(得分:5)

  

1.为什么主键(COLUMN1)被指定为" PRIMARY KEY CLUSTERED"?

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

  

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.上面的create table语法是实现它的最小语法吗?

没有。例如,可以省略约束名称,SQL Server将自动生成名称。但是,最佳做法是明确命名约束以便于后续的DDL更改,以便使目的是自我记录。就个人而言,我将默认约束命名为DF_TABLENAME_COLUMNNAME。

  

5.我的MySql表中有131555行。我应该指定IDENTITY(131556,1)以从131556开始自动增加密钥   我迁移数据?

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

答案 1 :(得分: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

  4. 在此处阅读有关身份列的信息:http://msdn.microsoft.com/en-us/library/ms186775.aspx