具有唯一索引的SQL克隆记录

时间:2008-09-29 16:58:21

标签: sql mysql database

是否有一种克隆SQL中具有索引(自动增量)的记录的简洁方法。我想克隆除索引之外的所有字段。我目前必须枚举每个字段,并在插入选择中使用它,我宁愿不明确列出所有字段,因为它们可能会随着时间的推移而改变。

6 个答案:

答案 0 :(得分:1)

除非你想进入动态SQL。既然你写了“干净”,我就不会这样做。

编辑:由于他要求提供动态SQL示例,我会对此进行一次尝试。我目前没有连接任何数据库,所以这是我的头脑,几乎肯定需要修改。但希望它能抓住事物的精神:

-- Get list of columns in table
SELECT INTO #t
EXEC sp_columns @table_name = N'TargetTable'

-- Create a comma-delimited string excluding the identity column
DECLARE @cols varchar(MAX)
SELECT @cols = COALESCE(@cols+',' ,'') + COLUMN_NAME FROM #t WHERE COLUMN_NAME <> 'id'

-- Construct dynamic SQL statement
DECLARE @sql varchar(MAX)
SET @sql = 'INSERT INTO TargetTable (' + @cols + ') ' +
    'SELECT ' + @cols + ' FROM TargetTable WHERE SomeCondition'

PRINT @sql -- for debugging
EXEC(@sql)

答案 1 :(得分:1)

没有简单而干净的方法可以让我想到我的头脑,但是从你问题中的一些项目我会关注你的底层架构。也许你有一个绝对合理的理由想要这样做,但通常你想尝试避免重复数据库,而不是让它们更容易导致。此外,明确命名列通常是一个好主意。如果您要链接到外部代码,则确保在添加新列时不会断开该链接。如果你不是(并且听起来你可能不在这种情况下)我仍然希望列出列,因为它迫使我查看更改/新列的效果 - 即使它只是为了查看代码并确定添加新列不是问题。

答案 2 :(得分:1)

这也处理一个唯一的密钥projectnum以及主键。

CREATE TEMPORARY TABLE projecttemp SELECT * FROM project WHERE projectid='6';
ALTER TABLE projecttemp DROP COLUMN projectid;
UPDATE projecttemp SET projectnum = CONCAT(projectnum, ' CLONED');
INSERT INTO project SELECT NULL,projecttemp.* FROM projecttemp;

答案 3 :(得分:0)

您可以创建插入触发器来执行此操作,但是,您将无法使用显式ID执行插入操作。相反,它总是使用序列中的值。

答案 4 :(得分:0)

您可以创建一个触发器来为您完成。要确保触发器仅适用于克隆,您可以创建单独的用户名CLONE并使用它登录。或者,更好的是,如果您的DBMS支持它,请创建一个名为CLONE的角色,任何用户都可以使用该角色登录并进行克隆。触发器代码类似于:

if (CURRENT_ROLE = 'CLONE') then
   new.ID = assign new id from generator/sequence

当然,您只会将该角色授予允许克隆记录的用户。

答案 5 :(得分:0)

DROP TABLE #tmp_MyTable

SELECT * INTO #tmp_MyTable
FROM MyTable
WHERE MyIndentID = 165

ALTER TABLE #tmp_MyTable
DROP Column MyIndentID

INSERT INTO MyTable
SELECT * 
FROM #tmp_MyTable