2012-02-21 48 views
-4

我2个表合并成1,使用下面的语句标识增量

Select Calls.*,Patient.* 
INTO Calls2 
From Calls,Patient 

现在,我设置列作为主键的一个,但我不能让该主键有标识递增。 我该怎么做才能做到这一点?

由于提前, 马杜

+0

它根本不是“非规范化”。这只是SQL语句。有一个在这里阅读http://msdn.microsoft.com/en-us/library/ms190750.aspx和这里http://msdn.microsoft.com/en-us/library/ms188029.aspx – 2012-02-21 16:38:57

+1

这是一个交叉连接所以除非其中一个表只有'<= 1'行,否则每个列都会有重复的值。你是如何从这个创建一个PK? – 2012-02-21 16:40:05

+0

@Martin的身份当然会是PK。为什么我们会关心实际数据是否是唯一的? :-) – 2012-02-21 21:25:39

回答

1

首先,你应该知道你正在做你的表的笛卡尔积。如果你想添加,当你创建表的标识列,然后执行以下操作:

Select IDENTITY(INT,1,1) ID, Calls.*,Patient.* 
INTO Calls2 
From Calls,Patient 
0

使用SQL Server Management Studio中

鼠标右键单击该表,然后单击Design。在右侧窗口底部的Column Properties中,向下滚动至Identity Specification。展开此项,然后将(Is Identity)值更改为Yes

但是,如果表格中已有Id列,则可能是CallsPatient表中的这一列可能无效。我建议创建一个新的Id列并配置Id列如上。

1

执行CREATE TABLE“硬”的方式?您可以从sys.columns轻松构建这样的命令。

或者在Management Studio中设置属性。请注意,这会丢弃表并重新创建它,所以如果表很大,则希望应用程序锁定一段时间。

0

你不能把现有的列到标识列*如果你需要一个标识列,加新列:

ALTER TABLE Calls2 ADD Calls2Id int NOT NULL IDENTITY(1,1) ; 

或者,如果你需要使用现有的一列,你需要使用一个明确的CREATE TABLE来定义表,而不是SELECT ... INTO。您还需要在INSERT INTO之前使用SET IDENTITY INSERT Calls2 ON。

CREATE TABLE Calls2 (
    ...columns... 
) ; 
SET IDENTITY_INSERT Calls2 ON ; 
INSERT INTO Calls2 (... columns ...) SELECT ... columns ... FROM Calls, Patient ; 
SET IDENTITY_INSERT Calls2 OFF ; 

*虽然设计师可能会假装把它变成一个标识列,但实际上并没有发生什么事情。正如Aaron Bertrand在他的回应中提到的那样,该表格正在重新创建,其中的列被定义为标识列。

+0

[是的,你可以...](http://stackoverflow.com/questions/6084572/how-to-set-auto-increment-after-creating-a-table-without-any-data-loss/6086661#6086661) – 2012-02-21 16:42:32

+0

我忘了设计师让你做到这一点。补充说明(我希望)。谢谢。 – eric 2012-02-21 17:00:50

+0

这不是我的意思,因为整个表格被重新创建。您可以这样做,因为元数据只能通过“ALTER TABLE ... SWITCH”进行更改 – 2012-02-21 17:02:17