Запись клона SQL с уникальным индексом - PullRequest
1 голос
/ 29 сентября 2008

Существует ли чистый способ клонирования записи в SQL с индексом (автоинкремент). Я хочу клонировать все поля, кроме индекса. В настоящее время мне нужно перечислить каждое поле и использовать его в выборке вставки, и я бы не стал явно перечислять все поля, так как они могут меняться со временем.

Ответы [ 6 ]

1 голос
/ 23 марта 2012

Это также касается уникального ключа 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;
1 голос
/ 29 сентября 2008

Нет простого и понятного способа, который я мог бы придумать, не задумываясь, но из нескольких пунктов вашего вопроса я бы был обеспокоен вашей базовой архитектурой. Может быть, у вас есть абсолютно законная причина для того, чтобы сделать это, но обычно вы хотите избегать дубликатов в базе данных, а не облегчать их поиск. Кроме того, явное присвоение имен столбцам обычно является хорошей идеей. Если вы ссылаетесь на внешний код, он гарантирует, что вы не прервете эту ссылку при добавлении нового столбца. Если это не так (и похоже, что вы, вероятно, не в этом сценарии), я все же предпочитаю перечислять столбцы, потому что это заставляет меня пересматривать последствия изменения / нового столбца - даже если это просто посмотреть на код и решить, что добавление нового столбца не является проблемой.

1 голос
/ 29 сентября 2008

Нет, если вы не хотите попасть в динамический 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)
0 голосов
/ 13 марта 2010
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
0 голосов
/ 29 сентября 2008

Вы можете создать триггер, чтобы сделать это для вас. Чтобы убедиться, что триггер работает только для клонирования, вы можете создать отдельное имя пользователя CLONE и войти в него. Или, что еще лучше, если ваша СУБД поддерживает это, создайте роль с именем CLONE, и любой пользователь сможет войти в систему с использованием этой роли и выполнить клонирование. Код триггера будет выглядеть примерно так:

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

Конечно, вы предоставите эту роль только пользователям, которым разрешено клонировать записи.

0 голосов
/ 29 сентября 2008

Вы можете создать триггер вставки, чтобы сделать это, однако вы потеряете возможность делать вставку с явным идентификатором. Вместо этого он всегда будет использовать значение из последовательности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...