2017-11-18 13 views
0

このテーブルをJob_TitleとJob_Beginからなる複合プライマリキーを使用してSQL管理Studioに挿入する必要があります。問題は、これらの列の両方がNULLの2行を持つことです。コンポジットプライマリキーはこれを紙面上で処理しますが、コンポジットプライマリキーがある場合でもNULL値を受け入れるプライマリキーをプログラムに与えません。これをどうやって回避するのですか?これまでの表のコードは以下の通りです。今は動作しませんのでご注意ください。 job_titleとjob_beginの "NOT NULL"を "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

+0

なぜ空白を使用しないのですか? – Bohemian

答えて

0

ちょうど "ヌル" 値のためのブランク(空の文字列、すなわち'')を使用するように、主キーの列は、nullにすることはできません。

"純粋主義者"にはあまり人気がないかもしれませんが、それはあなたの問題を解決し、大きな問題ではありません。ただ先に進みなさい。

+0

私はそれを試してみましたが、「不適切な構文が近くにあります」、「 ' –

+0

@WestonSapusek何を試しましたか?あなたが空文字列 '' ''の代わりに空白(何もない)を試したように思えます。この '' into into jobs values( ''、 '2015-01-01'、...)のように、 – Bohemian

+0

@Bohemianの日付カラムはnullでもかまいません。空の文字列は有効な日付ではないと思います。 – Taemyr

0

カラムを使用して主キーを構成するときに、カラムにNULL値を設定することはできません。

あなたができることは、NULL値を空白の値で置き換えることです。あなたが空白値でブランク値の両方のjob_titlejob_begin列を持つ複数の行、または複数の行を持つことができないので、各行が一意である必要がありますよう

ちょうど注意してくださいjob_title列と同じ日付のjob_begin列にあります。

1

あなたは、あなたのテーブル

    は、例えば列 のあなたの仕事のタイトル、日付、残りをマッピングするために、独自の表にこれらの列の
  1. IDを使用あなたのNULL列を移動
  2. 正規化する必要があります:
 

    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の組み合わせが一意でないと、プライマリキーexceptiに違反しますに。その場合、プライマリキーに列を追加することもできます。これは、ID(1,1)列でも一意にすることができます。

関連する問題