【问题标题】:SQL Trigger which add a new string if not exist如果不存在则添加新字符串的 SQL 触发器
【发布时间】:2014-09-07 00:26:13
【问题描述】:

我有一张表 wp_postmeta

meta_id     bigint(20)   unsigned            PRI     (NULL)   auto_increment           
post_id     bigint(20)   unsigned            MUL     0                                 
meta_key    varchar(255) utf8_unicode_ci     MUL     (NULL)                             
meta_value  longtext     utf8_unicode_ci             (NULL) 

这样的表:

meta_id     post_id       meta_key   meta_value
1           1             area       12
2           1             rooms      2
3           2             rooms      3

我需要创建一个触发器,如果​​该表不存在,它将向该表中添加一个字符串 使用 meta_key = 'area' 和 meta_value = '0'。 或 UPDATE 其中 meta_key = 'area' 和 meta_value = 'NULL'。

但是…… 每个 post_id 可能有很多 meta_key。并且每个 post_id 的 meta_key = 'area' 设置为限制 1。 但问题是不是每个 post_id 都有 meta_key = 'area' 所以首先需要创建它!

我现在有这样的东西..(下面的代码)它是一个部分,它将给出 meta_key = 'area' 的 meta_value = '0'。但我不明白如果不是,我该如何创建这个字符串存在。

CREATE
    TRIGGER `trigger` BEFORE INSERT ON `wp_postmeta` 
    FOR EACH ROW BEGIN
    IF NEW.meta_key = 'area' AND NEW.meta_value IS NULL THEN
    SET NEW.meta_value = '0';
END IF;
END;
$$

【问题讨论】:

    标签: sql wordpress triggers


    【解决方案1】:

    由于看起来必须在 wp_postmeta 条目之前创建 wp_posts 条目(否则您将不知道 post_id),我将在 wp_posts 上放置一个插入后触发器,以插入 @ 987654325@行。

    【讨论】:

    • 对不起..我听不懂你的意思..如果我要为 wp_posts 设置触发器..我需要在触发器中做什么?
    • wp_posts 添加一个触发器,在wp_postmeta 中插入空白行 - 因此对于wp_posts 中的每个(新)条目,您可以保证在@987654330 中有一个area 条目@。这不是你需要的吗?
    【解决方案2】:

    是这样吗:

    DELIMITER $$
    
    USE `dev_hiponia_hipo`$$
    
    DROP TRIGGER IF EXISTS `area_for_id`$$
    
    CREATE
        /*[DEFINER = { user | CURRENT_USER }]*/
        TRIGGER `dev_hiponia_hipo`.`area_for_id` AFTER INSERT ON `wp_posts`
        FOR EACH ROW BEGIN
        IF NEW.post_type = 'property' THEN
            INSERT INTO wp_postmeta (meta_key, meta_value, post_id) VALUES ('area', '0', NEW.ID);
        END IF;
        END;
    $$
    
    DELIMITER ;
    

    --> 当我设置新帖子时,它会自动设置区域值 => '0'

    我为 wp_postmeta 设置的第二个触发器:

          DELIMITER $$
    
    USE `dev_hiponia_hipo`$$
    
    DROP TRIGGER IF EXISTS `areamodif`$$
    
    CREATE
        /*!50017 DEFINER = 'devhiponia'@'192.168.1.%' */
        TRIGGER `areamodif` AFTER UPDATE ON `wp_postmeta` 
        FOR EACH ROW BEGIN
        IF NEW.meta_key = 'area' AND NEW.meta_value = '' THEN
            UPDATE wp_postmeta
            SET  meta_value = '0' 
            WHERE NEW.meta_key = 'area' AND meta_value = '';
        END IF;
    END;
    $$
    
    DELIMITER ;
    
    
    
    
    DELIMITER $$
    
    USE `dev_hiponia_hipo`$$
    
    DROP TRIGGER IF EXISTS `areaifdelete`$$
    
    CREATE
        /*[DEFINER = { user | CURRENT_USER }]*/
        TRIGGER `areaifdelete` AFTER DELETE ON `wp_postmeta`
        FOR EACH ROW BEGIN
        IF OLD.meta_key = 'area' THEN
            INSERT INTO wp_postmeta (meta_key, meta_value, post_id) VALUES ('area', '0', OLD.post_id);
        END IF;
        END;
    $$
    
    DELIMITER ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2018-12-19
      • 2021-09-30
      相关资源
      最近更新 更多