0

我确定我在这里做错了几件事。让我设定目标。

我有一个简单的表,其中包含以下列:

-----------------------------------------
编号 | 姓名 | 代码 | 父代号 | 父母身份
1 | locOne | 位置1 | |
2 | 洛克二 | 位置2 | 位置1 | (抓取值为 1)
3 | 锁定素 | 位置3 | 位置2 | (抓取值为 2)

我想从 csv 文件中导入名称、代码和 parentCode。id 会自动输入

然后我希望可以编写一个触发器,它将自动输入的 id 输入到 parentId 列中,从 parentCode=code 获取 id。

1)第一个问题——这可能吗?

我正在使用 SequelPro,并尝试将此作为更新的触发器:

INSERT INTO location (parentId)
SELECT id
FROM location
WHERE parentCode=code

这引发了错误:

无法写入行

MySQL 说:

无法更新存储函数/触发器中的表“位置”,因为它已被调用此存储函数/触发器的语句使用。

2)第二个问题——怎么做?

4

1 回答 1

1

在 MySQL 中,您不能在已定义触发器的表上发出 DML 语句。但是您可以做的是使用BEFORE触发器来更改正在插入或更新的值。

现在假设您的表的架构看起来像

CREATE TABLE location
(
  id int not null auto_increment primary key, 
  name varchar(128), 
  code varchar(128), 
  parentCode varchar(128), 
  parentId int
)

您的触发器可能看起来像

CREATE TRIGGER tg_bi_location
BEFORE INSERT ON location
FOR EACH ROW
  SET NEW.parentId = (SELECT id 
                        FROM location 
                       WHERE code = NEW.parentCode);

这是SQLFiddle演示


现在假设您的 CSV 文件看起来像

名称、代码、父代码
"locOne","loc1",
"locTwo","loc2","loc1"
"locThr","loc3","loc2"

您可以使用LOAD DATA INFILE批量加载数据

LOAD DATA INFILE '/path/to/your/file.csv'
INTO TABLE location
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n' -- or `\r\n` if it's Windows
IGNORE 1 LINES -- use this if your file contains a header line
(name, code, parentcode);
于 2013-09-27T02:10:42.813 回答