Mysql: SELECT * FROM .... без одного поля - PullRequest
9 голосов
/ 21 декабря 2011

Для дублирования записи я хотел бы использовать следующий синтаксис:

insert into TABLE select * from TABLE where ...

Однако, поскольку первый столбец является первичным ключом с автоинкрементом, это значение должно быть другим.Мой обходной путь - указать все поля в запросе выбора вместо использования звездочки, а затем оставить поле первичного ключа пустым.Поскольку в моей таблице более тридцати полей, которые, к сожалению, постоянно меняются, я ищу решение, которое можно реализовать в скрипте, и его не нужно изменять при изменении структуры таблицы.Есть идеи?Большое спасибо!

Ответы [ 2 ]

4 голосов
/ 21 декабря 2011

Пример:

mysql> create database dbase;
Query OK, 1 row affected (0.00 sec)

mysql> use dbase;
Database changed
mysql> create table tbl ( id integer not null primary key auto_increment, field2 integer, field3 integer );
Query OK, 0 rows affected (0.04 sec)

mysql> SET @sql = CONCAT ( 'SELECT ' , ( SELECT REPLACE ( GROUP_CONCAT( COLUMN_NAME ) , 'id,' , '' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE T
ABLE_NAME = 'tbl' AND TABLE_SCHEMA = 'dbase'), ' FROM tbl');
Query OK, 0 rows affected (0.01 sec)

mysql> select @sql;
+-------------------------------+
| @sql                          |
+-------------------------------+
| SELECT field2,field3 FROM tbl |
+-------------------------------+
1 row in set (0.00 sec)

mysql>

Теперь вам нужно только подготовить и выполнить ..

mysql> prepare stmt from @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute stmt;
Empty set (0.00 sec)

Строки не возвращены, поскольку строки не вставлены в таблицу.

А теперь вставляем и выполняем снова ..

mysql> insert into tbl ( field2, field3 ) values ( 1 , 2 ) , ( 3 , 4 ) ;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> execute stmt;
+--------+--------+
| field2 | field3 |
+--------+--------+
|      1 |      2 |
|      3 |      4 |
+--------+--------+
2 rows in set (0.00 sec)

Возвращаем все поля таблицы, кроме 'ID', указанного в @ sql

1 голос
/ 21 декабря 2011

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

Если это действительно важно, вы можете выполнить DESCRIBE TABLE, чтобы получить список столбцов, а затем построить свой запрос.Тем не менее, это, вероятно, просто усложнит ситуацию.Я бы посоветовал просто игнорировать первичный ключ.

...