2011-12-23 61 views
-1

我有以下表格:data_1,data_1,data_3,data_4,(data_ *)。从多个表插入?

所有人都有相同的字段名称。

我想将这些表中的所有错误条目(where error != '')插入到data_error表中,但只有特定的字段。

如何归档?

+0

听起来像是你应该已经归数据库架构。什么意思是“......但只有特定的领域”? – Matten 2011-12-23 16:41:14

回答

0

我想你想要做的事,如:

insert into table (fields) 
    select field from data_1 
    where error <> 1; 

如果你想做到这一点在所有表单查询,你可以做一些

insert into table (fields) 
    select field from data_1 
    where error <> 1 
    UNION 
    select field from data_2 
    where error <> 1 
    UNION 
    select field from data_3 
    where error <> 1; 

等。 。

+0

可以'data_1'为通配符吗?例如:'data_ *' – 2011-12-23 16:43:45

+0

不是直接。尽管如此,您可以通过存储过程来完成此操作。这将是相同的想法,但是你首先得到所有具有该名称的表,然后循环遍历这些表。 – 2011-12-23 16:45:06

0
INSERT INTO data_error (column1, column2, column3) 
SELECT column1, column2, column3 
FROM data_1 
WHERE error != '' 
UNION ALL 
SELECT column1, column2, column3 
FROM data_2 
WHERE error != '' 
UNION ALL 
SELECT column1, column2, column3 
FROM data_3 
WHERE error != '' 
UNION ALL 
SELECT column1, column2, column3 
FROM data_4 
WHERE error != '' 

MySQL Ref

+0

谢谢,是'data_ *'(通配符)不可能? – 2011-12-23 16:45:32

+0

使用通配符是不可能的。 – xbrady 2011-12-23 16:51:19

1

如果你想通过所有表如下表名一定的规则:

CREATE DEFINER=`root`@`localhost` PROCEDURE `TEST_TABLE_LOOP`() 
BEGIN 
    DECLARE data_TableName VARCHAR(50) DEFAULT ''; 
    DECLARE is_Done INT DEFAULT FALSE; 

    DECLARE insert_MainCursor CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE '<FILTER GOES HERE>'; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET is_Done = TRUE; 

    OPEN insert_MainCursor; 

    read_loop:LOOP 
     FETCH insert_MainCursor INTO data_TableName; 

     IF is_Done THEN 
      LEAVE read_loop; 
     END IF; 

     SET @sql = CONCAT('INSERT INTO <DESTINATION_TABLE_NAME_HERE> SELECT <COLUMN1>, <COLUMN2> FROM ', data_TableName, ' WHERE <SOMETHING_SOMETHING_GOES_HERE>'); 
     PREPARE stmt FROM @sql; 
     EXECUTE stmt; 
     DEALLOCATE PREPARE stmt; 

    END LOOP read_loop; 

    CLOSE insert_MainCursor; 
END