给定两张表:
-- Create table: city (FK)
CREATE TABLE city (
city_id INT PRIMARY KEY AUTO_INCREMENT,
city_name VARCHAR(150) NOT NULL UNIQUE
);
-- Create table: organizations
CREATE TABLE organization (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(150),
city_fk INT,
-- foreign key constraint
CONSTRAINT organization_fk_city
FOREIGN KEY (city_fk)
references city (city_id)
);
给定一个CSV文本文件,格式如下:
12332, Slack, Columbia
21242, Jackson, Columbia
23323, Thompson, Annapolis
我必须解析这个CSV文件到我的表,但我想知道我如何检查,看看是否已经存在一个记录在城市表中具有相同的名称。
是否有一个SQL函数/查询来检查'城市'匹配外键实体?
我有这个SQL '函数'我已经创建,但我不知道如何使用它插入记录时。
CREATE FUNCTION find_city(NAME VARCHAR) RETURNS INT
BEGIN
# initilize variables
DECLARE ID_FOUND INT DEFAULT 0;
-- Declare variable to hold results
ID_FOUND = SELECT city_id FROM city WHERE city_name = NAME;
-- If records are returned?
CASE
-- Return the foreign key ID found
WHEN ID_FOUND >= 1 THEN RETURN ID_FOUND
-- Insert new record into table
ELSE INSERT INTO `donorsearch`.`city` (`city_name`) VALUES (NAME);
END
END//
如果您以编程方式导入(正如您所表明的使用php所做的那样),并执行大量插入(如70MB的csv和短行所建议的那样),您的最佳选择是:
- 将城市表的名称和id值缓存到本地键值集中(键值取决于csv的预期值)
- 引用它来查找id值
- 如果没有找到值,则在城市表中执行适当的INSERT,并为本地缓存检索新行的id,然后继续。
你可以创建一个sql函数来获取名称,如果缺少则插入它,并返回id;正如你最初的想法所指向的;但是,这意味着以这种方式插入的每一行都要重复检查