使用复合主键在表中添加NULL值

时间:2017-11-18 23:25:36

标签: sql sql-server null

我需要将此表插入到SQL management Studio中,并使用由Job_Title和Job_Begin组成的复合主键。问题是,这两列都有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');

enter image description here

3 个答案:

答案 0 :(得分:1)

您应该规范化表格

  1. 将NULL列移动到自己的表中
  2. 使用这些列的ID来映射作业标题,日期和列的其余部分 例如:
  3. 
        CREATE TABLE [dbo].[job_title] 
            (
             [job_title_id] int identity(1,1) NOT NULL,
             [name] VARCHAR(255) NOT NULL, -- you can use 'Unknown' instead of NULL in your query
             PRIMARY KEY([job_title_id])
            )
            GO
        CREATE TABLE [dbo].[job_begin]
            (
             [job_begin_id] int identity(1,1) NOT NULL,
             [name] VARCHAR(255) NOT NULL,
             PRIMARY KEY([job_begin_id])
    
            )
            GO
         CREATE TABLE [dbo].[Jobs]
            (
             [job_title_id] int NOT NULL references job_title(job_title_id),
             [job_begin_id]  int NOT NULL references job_begin(job_begin_id),
             [proj_no]   VARCHAR(255) NOT NULL REFERENCES Projects (proj_no),
             [emp_no]    FLOAT NOT NULL REFERENCES Employees (emp_no),
             PRIMARY KEY([job_title_id], [job_begin_id])
    
            )
            GO
    
        INSERT INTO [dbo].[job_title](name)
        VALUES('Driver')
        GO;
    
        INSERT INTO [dbo].[job_begin](name)
        VALUES('2015-06-01')
        GO;
    
        INSERT INTO [dbo].[Jobs]([job_title_id], [job_begin_id], [proj_no], [emp_no])
        VALUES(1, 1, 'p2', '18316'),
        ...
    
    

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

答案 1 :(得分:0)

主键的列不能为空,因此只需使用空格(空字符串,即'')作为" null"值。

虽然它可能不会受到纯粹主义者的欢迎,但它解决了你的问题,并不是什么大不了的事。继续前进。

答案 2 :(得分:0)

使用列构成主键时,列中不能包含NULL值。

你可以做的就是用空值替换NULL值。

请注意,因为每行必须是唯一的,因此您不能在 job_title job_begin 列中包含多个空白值的行,或者更多 job_title 列中的空行值与 job_begin 列中的相同日期的行。