【问题标题】:Is it possible to restrict a sql table to only have a single row at the design stage是否可以在设计阶段将 sql 表限制为只有一行
【发布时间】:2016-03-19 17:33:27
【问题描述】:

我有一个如下脚本所示的简单表格。

    CREATE TABLE dbo.KeyNumbers (
  RowId INT IDENTITY
 ,ProFormaNumber NCHAR(10) NULL
 ,SalesOrderNumber NCHAR(10) NULL
 ,PurchaseOrderNumber NCHAR(10) NULL
 ,InvoiceCreditNoteNumber NCHAR(10) NULL
 ,InvoiceNumber NCHAR(10) NULL
 ,PurchaseInvoiceCreditNoteNumber NCHAR(10) NULL
 ,ModifiedDate DATETIME NULL
 ,CONSTRAINT PK_KeyNumbers PRIMARY KEY CLUSTERED (RowId)
) ON [PRIMARY]

该表用于存储公司的关键文档编号(发票编号、销售订单编号等),因此只需要一行。与该表的主要交互是通过存储过程完成的,因此最终用户永远不需要访问它,但我想知道 SQL Server 中是否有一种方法可以主动限制表只有一行,并且能够在设计阶段做到这一点。

编辑

证明 Gordon 的建议很有效

【问题讨论】:

    标签: sql sql-server sql-server-2014


    【解决方案1】:

    显而易见的方法是在插入时使用触发器来确保表为空。

    我从未尝试过,但计算列上的索引也可能有效:

    alter table dbo.KeyNumbers add OneAndOnly as ('OneAndOnly');
    
    alter table dbo.KeyNumbers add constraint unq_OneAndOnly unique (OneAndOnly);
    

    如果插入第二行,这应该会产生唯一键冲突。

    【讨论】:

    • 谢谢戈登。我将在一个新的数据库和表上快速尝试一下,我会告诉你的。
    • 效果很好,谢谢。已编辑问题以说明确实如此。
    【解决方案2】:

    --我认为这会更干净并利用现有的列

    CREATE TABLE dbo.KeyNumbers (
      RowId AS (1) PERSISTED
     ,ProFormaNumber NCHAR(10) NULL
     ,SalesOrderNumber NCHAR(10) NULL
     ,PurchaseOrderNumber NCHAR(10) NULL
     ,InvoiceCreditNoteNumber NCHAR(10) NULL
     ,InvoiceNumber NCHAR(10) NULL
     ,PurchaseInvoiceCreditNoteNumber NCHAR(10) NULL
     ,ModifiedDate DATETIME NULL
     ,CONSTRAINT PK_KeyNumbers PRIMARY KEY CLUSTERED (RowId)
    ) ON [PRIMARY]
    

    【讨论】:

    • .Vincent,谢谢你的回答。在很多方面我倾向于同意你关于它的可读性和简单性的看法,并因此标记了它。 Gordon 的回答让我看到了一个我以前没有探索过的 SQL 领域,以及在这个过程中学到的另一个新东西。
    【解决方案3】:

    您也可以使用代替触发器来完成相同的操作..

    create table test
    (
    id int
    )
    
    create trigger dbo.test_trgr
    on dbo.test
    instead of insert
    as
    begin
    --here we check table rows,if there are no rows,iinsert..else ignore
    if not exists(select 1 from dbo.test)
    begin
    
    insert into dbo.test
    select * from inserted
    
    end
    

    【讨论】:

      【解决方案4】:

      定义其中一列(任何列都可以):

      • check 约束,要求它是您最终想要的值
      • unique 约束

      例如,如果您希望 id 列具有值 1

      create table mytable (
          id int check (id = 1) unique,
          othercol1 text,
          othercol2 int // etc
      )
      

      现在最多可以有 1 行,并且必须有 id = 1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-18
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 2022-07-16
        • 1970-01-01
        • 2013-05-24
        相关资源
        最近更新 更多