【问题标题】:Creating a table with a compound primary key使用复合主键创建表
【发布时间】:2011-04-12 21:41:37
【问题描述】:

好的,我想创建一个表

TABLE log_table
email nvarchar(255)
,salesrep nvarchar(20)
,blastid int
,timestamp datetime

现在timestamp 的默认值是插入记录的日期时间,我希望主键位于emailblastid

我知道您可以使用聚集索引来做到这一点,但我不确定如何做到这一点的语法。请,任何帮助将不胜感激。我正在使用 SQL Server Management Studio 2008

【问题讨论】:

  • 谢谢大家,所有这些答案都很好,所以我要给大家一个赞成票,但我选择了最详细的一个

标签: sql sql-server-2008 clustered-index


【解决方案1】:
CREATE TABLE dbo.log_table
(
    email nvarchar(255) NOT NULL,
    salesrep nvarchar(2) NULL,
    blastid int NOT NULL,
    timestamp datetime NULL
)

ALTER TABLE dbo.log_table ADD CONSTRAINT
DF_log_table_timestamp DEFAULT GetDate() FOR timestamp

ALTER TABLE dbo.log_table ADD CONSTRAINT
PK_log_table PRIMARY KEY CLUSTERED 
(
    email,
    blastid
)
GO

如果您使用的是创建表 GUI,则可以在单击列以设置为主键时使用控件。

【讨论】:

  • 正如我对另一个答案的评论,您最好在 SQL Server 2008 中使用 DATETIME2。
  • 我使用 sysdate 作为默认值
【解决方案2】:
CONSTRAINT PK_LOG_TBL PRIMARY KEY CLUSTERED (email ASC, email ASC)

【讨论】:

    【解决方案3】:

    CREATE TABLE log_table ( email NVARCHAR(255) NOT NULL, salesrep NVARCHAR(255), blastid INT, [timestamp] DATETIME, PRIMARY KEY (email, blastid) )

    我相信时间戳默认值将通过插入时的 'GETDATE()' 来完成。

    【讨论】:

    • 正如我在编辑中添加的那样,您只需在插入时使用 'GETDATE()'。我不相信你可以让一个函数成为默认值。
    • 由于他正在使用 SQL Server 2008,MS 现在建议对所有新工作使用 DATETIME2,因为它具有更好的精度。要填写它,请使用 SYSDATETIME() 作为默认值。
    【解决方案4】:

    您需要创建一个复合主键。语法如下:

    CREATE TABLE log_table
    (
        email nvarchar(255),
        salesrep nvarchar(20),
        blastid int,
        timestamp datetime,
        PRIMARY KEY (email, blastid)
    )
    

    【讨论】:

      【解决方案5】:

      我会使用其他东西而不是“时间戳”——这是一种 sql server 数据类型。

          create table log_table
          (
          email nvarchar(255) not null
          ,salesrep nvarchar(20)
          ,blastid int not null
          ,timestamp datetime default getdate())
      
      
          ALTER TABLE dbo.log_table ADD CONSTRAINT
              PK_log_table PRIMARY KEY CLUSTERED 
              (
              email, blastid
              ) WITH( STATISTICS_NORECOMPUTE = OFF, 
      IGNORE_DUP_KEY = OFF, 
      ALLOW_ROW_LOCKS = ON, 
      ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
      

      【讨论】:

        猜你喜欢
        • 2017-07-22
        • 2023-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        相关资源
        最近更新 更多