我需要将此表插入到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');
答案 0 :(得分:1)
您应该规范化表格
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 列中的相同日期的行。