我可以将表T中的一行副本插入表T而不列出其列并且没有主键错误吗?

时间:2011-05-04 20:46:52

标签: sql tsql duplicate-data

我想做这样的事情:

INSERT INTO T SELECT * FROM T WHERE Column1 = 'MagicValue' -- (multiple rows may be affected)

问题是T有一个主键列,因此这会导致错误,就像尝试设置主键一样。坦率地说,我也不想设置主键。我想创建具有新主键的全新行,但其余字段将从原始行复制。

这应该是适用于各种表的通用代码。那么,如果没有好的方法,我会编写代码来动态提取列名,构建列表等。但也许有?我是第一个尝试在数据库中创建重复行的人吗?

2 个答案:

答案 0 :(得分:0)

我假设“主键”表示自动分配或自动增加的identityguid数据类型。

如果没有一些非常奇特的动态SQL,你就不能做你想做的事。如果要插入除标识字段以外的所有内容,则需要指定字段。

如果您要为该字段指定值,则需要指定SELECTINSERT AND 中的所有字段{{1} }。

答案 1 :(得分:0)

你没有从复制数据库中的行中获得任何东西(考虑到你没有尝试设置主键)。这将是更明智的,并将避免问题有另一列称为“金额”或其他什么。

类似

UPDATE T SET Amount = Amount + 1 WHERE Column1 = 'MagicValue'

或者如果它的返回字段数量增加超过1个

Update T SET Amount = Amount * 2 WHERE Column1 = 'MagicValue'

我不确定你要做的是什么,但是如果上述内容对你正在做的事情不起作用,我认为你的设计需要一个新表并将其插入那里。

编辑:同样如你的评论中所提到的,通用插入并不真正有意义。想象一下,为了实现这一点,你需要相同数量的字段,并且它们将保持相同的值,表明它们也应该具有相同的名称(即使它不需要它)。它基本上是两次相同的表结构。