我有以下表格:data_1
,data_1
,data_3
,data_4
,(data_ *)。从多个表插入?
所有人都有相同的字段名称。
我想将这些表中的所有错误条目(where error != ''
)插入到data_error
表中,但只有特定的字段。
如何归档?
我有以下表格:data_1
,data_1
,data_3
,data_4
,(data_ *)。从多个表插入?
所有人都有相同的字段名称。
我想将这些表中的所有错误条目(where error != ''
)插入到data_error
表中,但只有特定的字段。
如何归档?
我想你想要做的事,如:
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;
等。 。
可以'data_1'为通配符吗?例如:'data_ *' – 2011-12-23 16:43:45
不是直接。尽管如此,您可以通过存储过程来完成此操作。这将是相同的想法,但是你首先得到所有具有该名称的表,然后循环遍历这些表。 – 2011-12-23 16:45:06
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 != ''
谢谢,是'data_ *'(通配符)不可能? – 2011-12-23 16:45:32
使用通配符是不可能的。 – xbrady 2011-12-23 16:51:19
如果你想通过所有表如下表名一定的规则:
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
听起来像是你应该已经归数据库架构。什么意思是“......但只有特定的领域”? – Matten 2011-12-23 16:41:14