插入新记录时检查外键引用的函数

时间:2016-06-28 19:30:19

标签: mysql

给出两个表:

-- 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函数/查询来检查'city'是否匹配外键实体?

我已经创建了这个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//

1 个答案:

答案 0 :(得分:1)

如果你是以编程方式导入(正如你表明你正在使用php),并执行大量插入(如短线所示的70MB csv),你最好的选择是:

  • 将城市表的名称和ID值缓存到本地键控集中(以csv预期的值为键)
  • 引用即可找到id值
    • 如果找不到值,请在city表中执行相应的INSERT并检索本地缓存的新行ID,然后继续。

您可以创建一个sql函数来获取名称,如果缺少则插入它,并返回id;因为你最初的想法似乎正在前进;但这意味着对于以这种方式插入的每一行都会重复检查。