0

私はここでいくつか間違ったことをしていると確信しています。ゴールを設定させてください。

次のような列を持つ単純なテーブルがあります。

----------------------------------------------
ID | 名前 | コード | 親コード | 親ID
1 | ロクワン | loc1 | | |
2 | locTwo| loc2 | loc1 | (値 1 を取得)
3 | locThr | loc3 | loc2 | (グラブ値 2)

名前、コード、parentCode を csv ファイルからインポートしたいと思います。IDは自動入力されます

次に、自動入力されたIDをparentId列に入力し、parentCode = codeの場所からIDを取得するトリガーを作成できることを望んでいました。

1) 最初の質問 -- これは可能ですか?

私は SequelPro を使用しており、これを Update のトリガーとして試しました。

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

エラーをスローしたもの:

行を書き込めません

MySQL は次のように述べています。

このストアド関数/トリガーを呼び出したステートメントで既に使用されているため、ストアド関数/トリガーのテーブル '場所' を更新できません。

2) 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 に答える