2017-04-04 18 views
0

標題可能會引起誤解。我正在使用MSSQL數據庫服務器。MSSQL - 基於id的重複記錄,同時擁有兩個主鍵

我想達到的目標 - 我想根據不同的語言重複記錄。

例如,我列*language*和第*id*列 - 兩個主鍵。

結果我想:

id lang  name 
1  English x 
1  Foreign y 

如何到達呢? MSSQL不允許我插入具有相同ID的值。

我在論壇上閱讀,這是不可能的,但話又說回來,我使用MSSQL已經實際存在的結構的一個例子:

enter image description here

一個解決辦法我發現是 - 設置標識規格爲。我不確定這是最好的方法。有任何想法嗎?

回答

2

您可以有一個COMPOSITE PRIMARY KEY這是一個PRIMARY KEYtwo or more columns製成。

例如:

CREATE TABLE MYTABLE (
    id INT, 
    lang char(200), 
    name char(200), 
    primary key (id, lang) 
); 

您可以參考this document對複合主鍵更多的瞭解。

編輯

進行編輯/改變退出表,你可以做這樣的事情:

ALTER TABLE MYTABLE 
DROP CONSTRAINT PK_Table1_ColID 

ALTER TABLE MYTABLE 
ADD CONSTRAINT PK_Table1_ColIDLANG PRIMARY KEY (id, lang) 

要標識列顯式地插入值,做這樣的事情:

SET IDENTITY_INSERT MYTABLE ON; 

/* Do inserts */ 

SET IDENTITY_INSERT MYTABLE OFF; 
+0

嗯,是的,id和lang都是主鍵(set),但它不允許我插入具有相同id的記錄,即使語言值不相同。我已經有了包含數據的表格,所以我不能使用像create等語句,所以如果可以的話,請嘗試給現有表格編輯設計屬性提供答案。 – Poo123

+0

檢查編輯。 –

+0

好吧,爲了仔細檢查,我取下了所有主鍵並添加了約束。一切都很順利,但是當我嘗試插入 INSERT INTO X(ID,郎,名) VALUES (404, '儒', '江'), (404, '恩', '江'); 我得到 - 當IDENTITY_INSERT設置爲OFF時,無法在表'x'中爲標識列插入顯式值。 – Poo123

0

使用id和lang作爲複合主鍵,所以這兩個屬性的組合必須是唯一的:

CREATE TABLE testTable (
     id int not null, 
     lang varchar(30) not null, 
     name varchar(50), 
     PRIMARY KEY (id, lang) 
); 
0

如果您在id字段設置爲身份,然後它會自動把一個新值在該列的每一行。這就是身份欄的意義。所以如果你真的想要一些重複值,你需要將身份設置爲no。然後當你插入時,你可以插入你喜歡的任何值到該列中。

如果你想有身份的功能,但選擇什麼樣的插入,以及,你可以使用identity insert功能:

set identity_insert [tablename] on; 
insert into [tablename] (id, lang, name) values 
(1, 'English', 'x'), 
(1, 'Foreign', 'y') 
set identity_insert [tablename] off; 

您還可以使用複合主鍵作爲建議其他答案。

+0

我提到的例子更高,有身份規範。因此,我必須編輯 – Poo123

+0

以顯示identity_insert – BeanFrog