【问题标题】:Add multiple tags to table向表格添加多个标签
【发布时间】:2013-04-24 09:26:38
【问题描述】:

我在数据库中有一个表tags,我想创建一个基于添加值的查询,如果标签不存在name,则选择下一个ID,如果名称存在则选择标签ID

我创建了一个简单的代码:

DELIMITER $$
USE `cc`$$
DROP FUNCTION IF EXISTS getTagId$$
CREATE FUNCTION getTagId (tag CHAR(20)) RETURNS  INT CHARSET utf-8
    BEGIN
       DECLARE id INT
       set @id = (select id from tags where name = @tag)
           if (@id is null) then
            insert into tags(name) values(@tag)
            set @id = (select last_insert_id())
           end if
        SELECT @id
    END
delimiter;

但是这段代码不起作用(这是我在 MySQL 中的第一个函数)。

我想在单个查询中向数据库添加更多标签,然后是 10 个,您对如何优化有什么想法吗?

【问题讨论】:

  • 哪种方式不起作用?
  • 嗯,这是一个非常简单的操作,所以效率很高。 MySQL 中的函数效率不高(除非它们节省大量网络流量,但事实并非如此)。

标签: mysql sql database stored-functions


【解决方案1】:

但可能我的旧答案没用。真正的问题是:这个存储函数真的需要吗?我猜你这样做只是为了避免重复。

为了达到相同的目标:

  • 为 tags.name 添加唯一索引
  • 使用 INSERT IGNORE(如果该标签已存在则不会出错)

【讨论】:

  • Federico,效率更高吗?我需要它每分钟添加 600 个标签。
  • Jakub,一秒钟内 10 个 1-field INSERT 真的不是问题。另外,请考虑: MySQL 中的存储过程很慢;并且显式 SELECT 总是比强制执行 UNIQUE 约束要慢。
【解决方案2】:

您应该在最后一行之前添加$$

而且,你忘记了很多;

返回一个数字并指定字符集是荒谬的,可能是语法错误。

删除所有带有@id 的行并简单地添加RETURN last_insert_id();

IF NOT EXISTS ((select id from tags where name = tag)) THEN

(还要注意我从标签中删除了@!)

可能还有更多错误,但请注明:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多