我有一个非常简单的触发器,间歇性地导致MySQL抛出错误1054"未知列' company_id'在'新'"
我的触发器定义为:
DELIMITER $$
CREATE TRIGGER `retrieve_quotes`
BEFORE INSERT
ON `company_tick_data_t`
FOR EACH ROW BEGIN
SET @r_code = NEW.r_code;
SET NEW.`company_id` =
(
SELECT id
FROM companies_t
WHERE `r_code` = @r_code
LIMIT 1
);
END $$
DELIMITER ;
我不明白的是它工作得很好,我已经检查过以确保公司_t中存在列company_id。
以前,如果company_t表中没有值,则company_id设置为NULL,或者如果记录存在,则显然是相应的company_id。就像我说的那样,我显然不明白为什么它现在不起作用。
任何关于这可能出错的指示都会被感激地收到。我用谷歌搜索并查看了其他解决方案,但是没有一个与我根据选择查询的结果在将其插入表格之前更改值的情况相匹配。
答案 0 :(得分:1)
我知道这很古老,但我对数据库中名为 InventoryKey 的列有类似的头痛(在摆弄存储过程之后)。该字段存在,但 MySql 没有它!
mysql> describe Inventory;
+-----------------------+---------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+-------------------+----------------+
| inventoryId | int(11) | NO | PRI | NULL | auto_increment |
| inventoryKey | char(8) | YES | | NULL | |
| inventoryBatchId | int(11) | YES | MUL | NULL | |
| inventoryStatusTypeId | int(11) | YES | MUL | NULL | |
| inventoryCreationTime | timestamp | NO | | CURRENT_TIMESTAMP | |
| inventoryBatchSerial | int(3) | YES | | NULL | |
| inventoryComment | varchar(1024) | YES | | NULL | |
+-----------------------+---------------+------+-----+-------------------+----------------+
7 rows in set (0.14 sec)
但由于某种原因,错误中引用了另一个列名(inventoryGuid):
mysql> insert into Inventory (inventoryKey) values (LEFT(MD5(RAND()),8));
ERROR 1054 (42S22): Unknown column 'inventoryGuid' in 'NEW'
在仔细检查所有字段名称后,我得出结论,这是某种类型的损坏。重新启动 SQL 数据库并没有解决这个问题。最后,我采用如下方式重新创建表:
mysql> create table InventoryStaging like Inventory;
Query OK, 0 rows affected (0.62 sec)
mysql> insert into InventoryStaging select * from Inventory;
Query OK, 4 rows affected (0.04 sec)
mysql> drop table Inventory;
Query OK, 0 rows affected (0.30 sec)
mysql> create table Inventory like InventoryStaging;
Query OK, 0 rows affected (0.80 sec)
mysql> insert into Inventory select * from InventoryStaging;
Query OK, 4 rows affected (0.15 sec)
Records: 4 Duplicates: 0 Warnings: 0
... 然后同样的命令成功了:
mysql> insert into Inventory (inventoryKey) values (LEFT(MD5(RAND()),8));
Query OK, 1 row affected (0.05 sec)
希望这能避免其他地方的一些挫折和脱发!