mysql - примеры - sql продублировать строку



Как скопировать строку и вставить в ту же таблицу с полем автоинкремента в MySQL? (8)

IMO, лучше всего использовать операторы sql только для копирования этой строки, в то же время только ссылаясь на столбцы, которые вы должны и хотите изменить.

CREATE TEMPORARY TABLE temp_table ENGINE=MEMORY

SELECT * FROM your_table WHERE id=1;
UPDATE temp_table SET id=NULL; /* Update other values at will. */

INSERT INTO your_table SELECT * FROM temp_table;
DROP TABLE temp_table;

См. Также av8n.com - Как клонировать запись SQL

Выгоды:

  • В операциях SQL 2 упоминаются только те поля, которые необходимо изменить во время процесса клонирования. Они не знают о других областях или заботятся о них. Остальные поля просто идут на прогулку, без изменений. Это упрощает работу с инструкциями SQL, их легче читать, упрощать и расширять.
  • Используются только обычные операторы MySQL. Никаких других инструментов или языков программирования не требуется.
  • Полностью правильная запись вставляется в your_table в одной атомной операции.

https://src-bin.com

У меня есть таблица Eg-tab. То, что я пытаюсь сделать, это копирование строки с автоинкрементным столбцом ID = 1 и вставка данных в одну таблицу с идентификатором строки и столбца = 2.

Использование MySql. Как я могу сделать это в одном запросе?


Answer #1

Вы также можете передать «0» в качестве значения для автоматического увеличения числа столбцов, правильное значение будет использоваться, когда запись будет создана. Это намного проще, чем временные таблицы.

Источник: копирование строк в MySQL (см. Второй комментарий от TRiG к первому решению, Lore)


Answer #2

Для быстрого и чистого решения, которое не требует указания столбцов, вы можете использовать подготовленный оператор, как описано здесь: https://.com/a/23964285/292677

Если вам нужно комплексное решение, чтобы вы могли это делать часто, вы можете использовать эту процедуру:

DELIMITER $$

CREATE PROCEDURE `duplicateRows`(_schemaName text, _tableName text, _whereClause text, _omitColumns text)
SQL SECURITY INVOKER
BEGIN
  SELECT IF(TRIM(_omitColumns) <> '', CONCAT('id', ',', TRIM(_omitColumns)), 'id') INTO @omitColumns;

  SELECT GROUP_CONCAT(COLUMN_NAME) FROM information_schema.columns 
  WHERE table_schema = _schemaName AND table_name = _tableName AND FIND_IN_SET(COLUMN_NAME,@omitColumns) = 0 ORDER BY ORDINAL_POSITION INTO @columns;

  SET @sql = CONCAT('INSERT INTO ', _tableName, '(', @columns, ')',
  'SELECT ', @columns, 
  ' FROM ', _schemaName, '.', _tableName, ' ',  _whereClause);

  PREPARE stmt1 FROM @sql;
  EXECUTE stmt1;
END

Вы можете запустить его с помощью:

CALL duplicateRows('database', 'table', 'WHERE condition = optional', 'omit_columns_optional');

Примеры

duplicateRows('acl', 'users', 'WHERE id = 200'); -- will duplicate the row for the user with id 200
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts'); -- same as above but will not copy the created_ts column value    
duplicateRows('acl', 'users', 'WHERE id = 200', 'created_ts,updated_ts'); -- same as above but also omits the updated_ts column
duplicateRows('acl', 'users'); -- will duplicate all records in the table

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это решение предназначено только для тех, кто часто будет дублировать строки во многих таблицах. Это может быть опасно в руках пользователя-изгоев.


Answer #3

Скажем, что таблица является user(id, user_name, user_email) .

Вы можете использовать этот запрос:

INSERT INTO user (SELECT NULL,user_name, user_email FROM user WHERE id = 1)

Answer #4

Я склонен использовать вариацию того, что mu слишком короткое:

INSERT INTO something_log
SELECT NULL, s.*
FROM something AS s
WHERE s.id = 1;

Пока таблицы имеют одинаковые поля (за исключением автоматического приращения в таблице журналов), тогда это работает хорошо.

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

Он также гарантирует, что если вы добавите новые поля в таблицу, они сразу начнут появляться в таблице журналов, не обновляя ваши запросы к базе данных (если, конечно, у вас есть некоторые, которые задают поле явно)

Предупреждение: вам нужно обязательно добавить любые новые поля в обе таблицы одновременно, чтобы порядок полей оставался одинаковым ... иначе вы начнете получать нечетные ошибки. Если вы единственный, кто пишет интерфейсы баз данных, и вы очень осторожны, то это работает хорошо. В противном случае придерживайтесь названия всех ваших полей.

Примечание. Если подумать, если вы не работаете над сольным проектом, который, как вы уверены, не будет иметь других, работающих на нем, будет ссылаться на то, чтобы перечислять все имена полей в явном виде и обновлять ваши операторы журналов по мере изменения вашей схемы. Этот ярлык, вероятно, не стоит долговременной головной боли, которую он может вызвать ... особенно в производственной системе.


Answer #5

это очень помогло мне, и оно поддерживает столбцы BLOB / TEXT.

CREATE TEMPORARY TABLE temp_table
AS
SELECT * FROM source_table WHERE id=2;
UPDATE temp_table SET id=NULL' WHERE id=2;
INSERT INTO source_table SELECT * FROM temp_table;
DROP TEMPORARY TABLE temp_table;

Answer #6
INSERT INTO `dbMyDataBase`.`tblMyTable` 
(
    `IdAutoincrement`, 
    `Column2`, 
    `Column3`, 
    `Column4` 
) 

SELECT 
    NULL,  
    `Column2`, 
    `Column3`, 
    'CustomValue' AS Column4 
FROM `dbMyDataBase`.`tblMyTable` 
WHERE `tblMyTable`.`Column2` = 'UniqueValueOfTheKey' 
; 
/* mySQL 5.6 */

Answer #7
insert into MyTable(field1, field2, id_backup)
    select field1, field2, uniqueId from MyTable where uniqueId = @Id;




copy