對於重複的條目,我想用下面的語法:MySQL的:SELECT * FROM ....沒有一個領域
insert into TABLE select * from TABLE where ...
然而,隨着第一列是一個自動增加的主鍵,這價值必須不同。我的解決方法是在選擇查詢中指定所有字段,而不是使用星號,然後將主鍵字段留空。由於我的表有超過30個字段不幸保持不斷變化,所以我正在尋找一種可以在腳本中實現的解決方案,並且在表結構更改時不需要修改該解決方案。有任何想法嗎?非常感謝你!
對於重複的條目,我想用下面的語法:MySQL的:SELECT * FROM ....沒有一個領域
insert into TABLE select * from TABLE where ...
然而,隨着第一列是一個自動增加的主鍵,這價值必須不同。我的解決方法是在選擇查詢中指定所有字段,而不是使用星號,然後將主鍵字段留空。由於我的表有超過30個字段不幸保持不斷變化,所以我正在尋找一種可以在腳本中實現的解決方案,並且在表結構更改時不需要修改該解決方案。有任何想法嗎?非常感謝你!
MySQL不提供消除這種字段的方法。但是,如果你知道你總是需要除主鍵以外的所有字段,那麼獲取主鍵也沒有多少開銷。排除代碼中的主鍵會容易得多。
如果確實很重要,可以執行DESCRIBE TABLE
以獲取列的列表,然後構建查詢。但是,這可能只是讓事情變得更加複雜。我建議只是忽略主鍵。
例子:
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)
返回除了@sql指定的「ID」的所有表中的字段
'動態SQL' ftw! – 2011-12-21 13:42:43
不幸的是,有沒有真正的另一種方式。看到我的問題[SELECT * EXCEPT](http://stackoverflow.com/questions/413819/select-except),這是在類似的脈絡。 – 2011-12-21 13:32:29