SQL Server创建表查询

4
我正在使用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被索引。在Sql Server中,NONCLUSTERED INDEX是等价物吗?

    CREATE NONCLUSTERED INDEX [COLUMN3] ON [dbo].[TABLE1]([COLUMN3] ASC); 的含义是什么?

  3. 我不理解以下内容:

    EXECUTE 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开始自动增加键吗?
2个回答

7
1. 为什么要将主键(COLUMN1)指定为“PRIMARY KEY CLUSTERED”?
通常最好为每个SQL Server表创建聚集索引,每个表只允许有一个聚集索引,因为聚集索引的B树叶节点是实际数据页。支持主键的索引通常是最佳选择,但如果对于特定情况而言非聚集主键和不同的聚集索引更具优势,则可以这样做。例如,如果您的查询经常在COLUMN3上进行范围搜索而不是通过COLUMN1选择或连接的查询,则COLUMN3索引可能是更好的选择,以及非聚集主键。
2. 在原始的MySql表中,COLUMN3被索引了。NONCLUSTERED INDEX是否相当于Sql Server中的索引?什么是它的意义?
非聚集索引也是B树索引,允许按索引键定位行比表扫描更有效。
3. 我不理解以下内容: EXECUTE 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已经为您完成了此操作。

1

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

  1. SQL Server allows you to add extended properties to objects - see here for details: http://technet.microsoft.com/en-us/library/ms190243%28v=sql.105%29.aspx. Basically they are for storing metadata about the object - a description for the table for example, or an input mask for a column.

  2. Here's the full syntax for creating tables: http://msdn.microsoft.com/en-AU/library/ms174979.aspx. I note that your example is creating the table and adding some default constraints. You could rewrite this as

     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. It really depends on whether you want to retain your existing key values, which I would assume you do. If so you should insert the data with

    SET IDENTITY_INSERT yourTable ON

在这里阅读关于标识列的内容:http://msdn.microsoft.com/zh-cn/library/ms186775.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接