【问题标题】:Adding NULL values in a table with a composite primary key在具有复合主键的表中添加 NULL 值
【发布时间】:2017-11-18 23:25:35
【问题描述】:

我需要使用由 Job_Title 和 Job_Begin 组成的复合主键将此表插入 SQL 管理 Studio。问题是,这两列都有 2 行它们为 NULL。复合主键在纸上处理了这一点,但程序不会让我有一个接受 NULL 值的主键,即使有复合主键也是如此。我该如何解决这个问题?到目前为止,该表的代码如下。请注意,它现在不起作用。只需将 job_title 和 job_begin 的“NOT NULL”更改为“NULL”,程序就不允许我将这些列定义为主键。

    CREATE TABLE [dbo].[Jobs]
    (
     [job_title] VARCHAR(255) NOT NULL ,
     [job_begin] VARCHAR(255) NOT NULL ,
     [proj_no]   VARCHAR(255) NOT NULL REFERENCES Projects (proj_no),
     [emp_no]    FLOAT NOT NULL REFERENCES Employees (emp_no),
     PRIMARY KEY([job_title], [job_begin])

    );
    GO

INSERT INTO [dbo].[Jobs]([job_title], [job_begin], [proj_no], [emp_no])
VALUES('Driver', '2015-06-01', 'p2', '18316'),
       (NULL, '2015-08-01', 'p1', '28559'),
       ('Engineer', '2016-02-01', 'p2', '28559'),
       ('Analyst', '2015-10-15', 'p3', '2581'),
       ('Manager', '2015-04-15', 'p1', '9031'),
       ('Engineer', '2014-11-15', 'p3', '9031'),
       ('Engineer', '2015-01-04', 'p1', '29346'),
       (NULL, '2014-12-15', 'p2', '29346'),
       ('Analyst', '2015-09-25', 'p11', '30606'),
       ('Programmer', NULL, 'p20', '30606'),
       ('Analyst', '2014-10-01', 'p1', '10102'),
       ('Manager', '2012-01-01', 'p3', '10102'),
       ('Engineer', '2015-02-15', 'p2', '25348'),
       ('QA', NULL, 'p11', '5500'),
       ('Programmer', '2016-11-09', 'p14', '5500'),
       ('QA', '2016-03-22', 'p2', '5500'),
       ('Manager', '2013-01-18', 'p20', '5500');

【问题讨论】:

  • 为什么不用空格?

标签: sql sql-server null


【解决方案1】:

你应该规范化你的表格

  1. 将 NULL 列移到自己的表中
  2. 使用这些列的 ID 来映射您的职位、日期和其他列 例如:
创建表 [dbo].[job_title] ( [job_title_id] int identity(1,1) NOT NULL, [name] VARCHAR(255) NOT NULL, -- 您可以在查询中使用 'Unknown' 而不是 NULL 主键([job_title_id]) ) 去 创建表 [dbo].[job_begin] ( [job_begin_id] int identity(1,1) NOT NULL, [名称] VARCHAR(255) 非空, 主键([job_begin_id]) ) 去 创建表 [dbo].[工作] ( [job_title_id] int NOT NULL 引用 job_title(job_title_id), [job_begin_id] int NOT NULL 引用 job_begin(job_begin_id), [proj_no] VARCHAR(255) NOT NULL REFERENCES 项目 (proj_no), [emp_no] FLOAT NOT NULL REFERENCES 员工 (emp_no), 主键([job_title_id],[job_begin_id]) ) 去 插入 [dbo].[job_title](名称) 值('驱动程序') 去; 插入 [dbo].[job_begin](名称) 价值观('2015-06-01') 去; 插入 [dbo].[Jobs]([job_title_id], [job_begin_id], [proj_no], [emp_no]) 值(1、1、'p2'、'18316')、 ...

但如前所述,如果您的 job_title 和 job_begin 组合不是唯一的,您将获得违反主键异常。在这种情况下,您可以向主键添加其他列 - 甚至是 identity(1,1) 列以使其唯一。

【讨论】:

    【解决方案2】:

    在使用列构成主键时,列中不能有 NULL 值。

    您可以做的可能只是将 NULL 值替换为空白值。

    请小心,因为每一行都必须是唯一的,因此 job_titlejob_begin 列中的空白值不能超过一行,或者更多job_title 列中有一个空白值且 job_begin 列中有相同日期的行。

    【讨论】:

      【解决方案3】:

      主键的列不能为空,所以“空”值只需使用空白(空字符串,即'')即可。

      虽然它可能不受“纯粹主义者”的欢迎,但它可以解决您的问题,而且没什么大不了的。继续前进。

      【讨论】:

      • 我试过了,它说“',''附近的语法不正确
      • @WestonSapusek 你尝试了什么?听起来您尝试了空白(无)而不是空白字符串''。像这样insert into jobs values ('', '2015-01-01', ...)
      • @Bohemian 他的日期列可以为空,我认为空字符串不是有效日期。
      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2010-12-05
      • 2013-04-30
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多