2011-12-21 44 views
9

Đối với sao chép một mục Tôi muốn sử dụng cú pháp sau:Mysql: SELECT * FROM .... mà không có một lĩnh vực

insert into TABLE select * from TABLE where ... 

Tuy nhiên, như cột đầu tiên là một khóa chính auto-increment, đây giá trị phải khác nhau. Cách giải quyết của tôi là xác định tất cả các trường trong truy vấn chọn thay vì sử dụng dấu sao và sau đó để trống trường khóa chính. Vì bảng của tôi có hơn ba mươi trường không may thay đổi, tôi đang tìm một giải pháp mà tôi có thể triển khai trong tập lệnh và không cần phải sửa đổi khi cấu trúc bảng thay đổi. Bất kỳ ý tưởng? Cảm ơn nhiều!

+2

Thật không may, không có thực sự một cách khác. Xem câu hỏi của tôi [SELECT * EXCEPT] (http://stackoverflow.com/questions/413819/select-except) đó là trong một tĩnh mạch tương tự. –

Trả lời

1

MySQL không cung cấp cách loại bỏ các trường như thế này. Tuy nhiên, nếu bạn biết bạn sẽ luôn luôn muốn tất cả các lĩnh vực nhưng khóa chính, sau đó có thực sự không có nhiều chi phí để lấy chìa khóa chính là tốt. Việc loại trừ khóa chính trong mã của bạn sẽ dễ dàng hơn nhiều.

Nếu việc thực hiện điều này thực sự quan trọng, bạn có thể thực hiện DESCRIBE TABLE để nhận danh sách các cột và sau đó xây dựng truy vấn của bạn. Tuy nhiên, điều này có khả năng chỉ làm cho mọi thứ phức tạp hơn nhiều. Tôi khuyên bạn nên bỏ qua khóa chính.

4

Ví dụ:

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> 

Bây giờ bạn chỉ có để chuẩn bị và thực hiện ..

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

mysql> execute stmt; 
Empty set (0.00 sec) 

Không có hàng trả lại vì không có hàng chèn vào trong bảng.

Và bây giờ chèn và thực hiện một lần nữa ..

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) 

Return mọi lĩnh vực bảng trừ 'ID' của quy định tại @sql

+0

'Dynamic SQL' ftw! –

Các vấn đề liên quan