скопировать строку в той же таблице и обновить только один столбец в MySQL - PullRequest
2 голосов
/ 08 декабря 2010

Мне нужно скопировать строку, основанную на некотором условии (условие where), из таблицы, сделать дубликат записи в той же таблице и обновить только один столбец (foreign_key). Но так как «select * from Table_name» возвращает все поля, включая primary_key, он не может вставить новую строку ошибка: дубликат ключа.

Я не знаю всех столбцов таблицы, поэтому я не могу игнорировать primary_key, предоставляя только требуемые имена столбцов в запросе выбора.

Есть ли способ игнорировать primary_key при получении самого себя ... или я могу получить всю строку, установить значение primary_key в null, а затем вставить строку в таблицу, чтобы она автоматически увеличивала значение primary_key для новой строки добавлено.

Спасибо.

Ответы [ 3 ]

5 голосов
/ 08 декабря 2010

Можно сделать то, что вы хотите, запросив таблицы информационной схемы и используя динамический SQL для построения соответствующего оператора.Однако вы должны быть очень осторожны с этим подходом, так как изменение данных в таблицах, для которых вы не знаете имен столбцов, может привести к всевозможным проблемам:

DROP TABLE mytable;

CREATE TABLE `mytable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  `col3` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

INSERT INTO mytable (col1, col2, col3) VALUES ('A', 'B', 'C');

SELECT * FROM mytable;

+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 | A    | B    | C    |
+----+------+------+------+

SET @columns := (
  SELECT
    GROUP_CONCAT(column_name)
    FROM information_schema.columns
    WHERE table_schema = 'test'
    AND table_name = 'mytable'
    AND column_key <> 'PRI'
);

SET @sql := (
  SELECT CONCAT(
    'INSERT INTO mytable (', @columns, ') ',
    'SELECT ', @columns, ' FROM mytable ',
    'WHERE id = 1;'
  )
);

SELECT @sql;

+---------------------------------------------------------------------------------------+
| @sql                                                                                  |
+---------------------------------------------------------------------------------------+
| INSERT INTO mytable (col1,col2,col3) SELECT col1,col2,col3 FROM mytable WHERE id = 1; |
+---------------------------------------------------------------------------------------+

PREPARE stmt FROM @sql;

EXECUTE stmt;

SELECT * FROM mytable;

+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 | A    | B    | C    |
|  2 | A    | B    | C    |
+----+------+------+------+
0 голосов
/ 08 декабря 2010

Как так получается, что вы знаете, что это за ключ, но не знаете, что такое другие столбцы?Если это действительно так, то я думаю, что вам придется написать некоторый динамический SQL - или, что еще лучше, дать задание тому, кто знает , знает структуру таблицы.

0 голосов
/ 08 декабря 2010

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

Проверьте, если это работает,

Спасибо.

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