【问题标题】:Unknown cause of syntax error for DELETE in MariaDB 10.1MariaDB 10.1 中 DELETE 语法错误的未知原因
【发布时间】:2019-02-06 18:18:43
【问题描述】:

on db Fiddle 下面的代码在 MariaDB 10.1 上运行时给出:

错误:

您的 SQL 语法有错误;检查手册 对应于您的 MariaDB 服务器版本,以便使用正确的语法 'DELETE pm FROM wp_postmeta pm WHERE post_id IN (SELECT post_id ' 在第 26 行

查询:

-- Block 1: Deleting all duplicate products in wp_posts table 
DELETE FROM wp_posts 
WHERE  id IN (SELECT id 
              FROM   (SELECT id, 
                             post_title, 
                             post_type, 
                             meta_value 
                      FROM   (SELECT wp_posts.id, 
                                     wp_postmeta.post_id, 
                                     post_title, 
                                     post_type, 
                                     meta_value, 
                                     Row_number() 
                                       OVER( 
                                         partition BY post_title 
                                         ORDER BY wp_postmeta.meta_value) rn 
                              FROM   wp_postmeta 
                                     JOIN wp_posts 
                                       ON wp_postmeta.post_id = wp_posts.id 
                              WHERE  wp_posts.post_type = 'Product' 
                                     AND wp_postmeta.meta_key = '_regular_price' 
                             ) t 
                      WHERE  t.rn <> 1) AS aliasx); 

-- Block 2: Deleting all corresponding wp_postmeta.post_ids that don't have a match in wp_posts.id after the duplicate deletion above
DELETE pm 
FROM   wp_postmeta pm 
WHERE  post_id IN (SELECT post_id 
                   FROM  (SELECT post_id 
                          FROM   wp_postmeta pm 
                                 LEFT JOIN wp_posts p 
                                        ON p.id = pm.post_id 
                          WHERE  p.id IS NULL 
                                 AND p.post_type = "product") i) 

如何纠正这个错误?我注意到第一个和第二个代码块单独输入时不会出现错误,但是一起输入时会出现此错误...

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    WordPress 使用的 MySQL API 不允许您将两个串联查询(在您的情况下为两个 DELETE)作为一个查询。 dbfiddle 也没有。分别运行查询。

    如果您习惯于其他表服务器,这可能会让人感到困惑。

    【讨论】:

      【解决方案2】:

      它实际上只是拆分 Delete 语句

      create table wp_posts (
        ID integer primary key auto_increment,
        post_title varchar(30),
        post_type varchar(30)
      );
      
      create table wp_postmeta (
        ID integer primary key auto_increment,
        post_id integer,
        meta_key varchar(30) not null default '_regular_price',
        meta_value integer not null
      );
      
      insert into wp_posts (post_title, post_type) values
      ('Apple Pie','Product'),
      ('French Toast','Product'),
      ('Shepards Pie','Product'),
      ('Jam Pie','Product'),
      ('Jam Pie','Product'),
      ('Plate','Not a Product'),
      ('Bucket','Not a Product'),
      ('Chequebook','Not a Product'),
      ('French Toast','Product'),
      ('French Toast','Product'),
      ('Banana','Product'),
      ('Banana','Product'),
      ('Banana','Product');
      
      insert into wp_postmeta (post_id, meta_value) values
      (1,10),
      (2,5),
      (3,9),
      (4,8),
      (5,11),
      (6,12),
      (7,10),
      (8,6),
      (9,1),
      (10,1),
      (11,7),
      (12,2),
      (13,2);
      
      -- Deleting all duplicate products in wp_posts table 
      DELETE FROM wp_posts 
      WHERE  id IN (SELECT id 
                    FROM   (SELECT id, 
                                   post_title, 
                                   post_type, 
                                   meta_value 
                            FROM   (SELECT wp_posts.id, 
                                           wp_postmeta.post_id, 
                                           post_title, 
                                           post_type, 
                                           meta_value, 
                                           Row_number() 
                                             OVER( 
                                               partition BY post_title 
                                               ORDER BY wp_postmeta.meta_value) rn 
                                    FROM   wp_postmeta 
                                           JOIN wp_posts 
                                             ON wp_postmeta.post_id = wp_posts.id 
                                    WHERE  wp_posts.post_type = 'Product' 
                                           AND wp_postmeta.meta_key = '_regular_price' 
                                   ) t 
                            WHERE  t.rn <> 1) AS aliasx); 
      
      -- Deleting all corresponding wp_postmeta.post_ids that don't have a match in wp_posts.id after the duplicate deletion above
      DELETE pm 
      FROM   wp_postmeta pm 
      WHERE  post_id IN (SELECT post_id 
                         FROM  (SELECT post_id 
                                FROM   wp_postmeta pm 
                                       LEFT JOIN wp_posts p 
                                              ON p.id = pm.post_id 
                                WHERE  p.id IS NULL 
                                       AND p.post_type = "product") i) 
      

      db小提琴here

      【讨论】:

      • 我不是已经使用中间分号分隔查询了吗?
      • 那只是一个 SQL 编辑器。 ; 对 mysql 本身来说已经足够了,但对 dbfiddle 来说不够 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      相关资源
      最近更新 更多