问题描述
我正在尝试使用null
值更新表。这是场景:
在我的初始运行中,表格如下所示:
+----+----------+-------+-------+-------+
| id | item | col_1 | col_2 | col_3 |
+----+----------+-------+-------+-------+
| 1 | abc | 10 | 20 | 30 |
+----+----------+-------+-------+-------+
但是,在我的后续运行中,表格列将包含如下所示的其他列:
+----+----------+-------+-------+-------+-------+-------+
| id | item | col_1 | col_2 | col_3 | col_4 | col_5 |
+----+----------+-------+-------+-------+-------+-------+
| 1 | abc | 10 | 20 | 30 | null | null |
+----+----------+-------+-------+-------+-------+-------+
| 2 | ghq | null | 40 | null | 50 | 60 | -- triggers the update of row_1. At the same time should update row_2
+----+----------+-------+-------+-------+-------+-------+
| 3 | xyz | 70 | 80 | null | 90 | null | -- updates row_3 and same updates moving forward
+----+----------+-------+-------+-------+-------+-------+
这是它在后端的工作方式:
- 初始运行会创建表格。
- 在随后的运行中,它将更改表以添加其他列(col_4和col_5)。
- 然后,更新记录,保留一些空单元格。
现在,我想用来自另一个表的数据填充空单元格。
我正在考虑使用触发器,但是正如您在上面看到的那样,要更新的null由下一行触发。另一方面,我不确定存储过程和函数是否可以使用。
我是一个快速学习者,我至少需要一些线索或指南,至少是什么最好的方法?
尝试1:循环存储过程
错误代码:1054。“字段列表”中的未知列“ @col_name”
CREATE DEFINER=`admin`@`%` PROCEDURE `fill_null_values`()
BEGIN
DECLARE c INT DEFAULT 0; -- number of columns
DECLARE r INT DEFAULT 0; -- number of rows
DECLARE i INT DEFAULT 0; -- rows counter
DECLARE e INT DEFAULT 0; -- columns counter
DECLARE col_name VARCHAR(100); -- bad table column name
/* initialize c = number of columns */
SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test_db' AND TABLE_NAME = 'bad_table'
INTO c;
/* initialize r = number of rows */
SELECT COUNT(*) FROM bad_table INTO r;
SET i = 0;
SET e = 7; -- starts at column 7
SET col_name = '';
WHILE i <= r DO
WHILE e <= c DO
/* get col_name */
SET col_name = CONCAT("SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test_db'
AND TABLE_NAME = 'canvass_prices'
AND ORDINAL_POSITION = e");
/* update null values */
SET @sql = CONCAT("UPDATE bad_table
SET `",col_name,"` = (
SELECT ref_data FROM ref_table
JOIN bad_table ON ref_table.id = bad_table.id
WHERE bad_table.ref_data = i)
WHERE `","` IS NULL");
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET e = e + 1;
END WHILE;
SET i = i + 1;
END WHILE;
END
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)