MSSQL - 基于id复制记录,同时有两个主键

时间:2017-04-04 06:47:18

标签: sql-server

标题可能会产生误导。我正在使用MSSQL数据库服务器。

我想要达到的目标 - 我希望基于不同的语言有重复的记录。

例如,我列*language*和列*id* - 两个主键。

我想要的结果:

id    lang     name
1     English  x
1     Foreign  y

如何达到此目的? MSSQL不允许我插入具有相同id的值。

我在论坛中已经读到这是不可能的,但是再一次,我有一个使用MSSQL的真实存在结构的例子:

enter image description here

我找到的一个解决方案是 - 将身份规范设置为 no 。我不确定这是最好的方法。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以拥有COMPOSITE PRIMARY KEY PRIMARY KEYtwo or more columns来自CREATE TABLE MYTABLE ( id INT, lang char(200), name char(200), primary key (id, lang) );

例如:

ALTER TABLE  MYTABLE 
DROP CONSTRAINT PK_Table1_ColID

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

您可以参考this document以了解有关复合主键的更多信息。

修改

对于编辑/更改现有表格,您可以执行以下操作:

SET IDENTITY_INSERT MYTABLE ON;

/* Do inserts */

SET IDENTITY_INSERT MYTABLE OFF;

要在标识列中显式插入值,请执行以下操作:

/ define fineUploader
$('div#' + thisUpload).fineUploader({
debug: data.debug_enable,
request: {
endpoint: '{url controller=Basketupload action=doUpload forceSecure}'
}
callbacks: {
onError: function(id, name, errorReason, xhrOrXdr) {
//fetch the error and open dialog
$( ".qq-confirm-dialog-selector" ).dialog({...});
//
}
}

答案 1 :(得分:0)

使用id和lang作为复合主键,因此这两个属性的组合必须是唯一的:

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

答案 2 :(得分: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;

您还可以按照其他答案中的建议使用复合主键。