【问题标题】:MySQL insert into selectMySQL插入选择
【发布时间】:2015-06-05 02:00:03
【问题描述】:

我正在尝试在表中插入一行,该表有 3 个外键。为了获得这些键,我有“独特的”要搜索的字段。

sql

create table user(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(30) NOT NULL,
    access_token VARCHAR(32),
    reg_date TIMESTAMP,
    UNIQUE(username),
    UNIQUE(access_token)


);

create table pharmacy(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    places_id VARCHAR(50) NOT NULL,
    name VARCHAR(30) NOT NULL,
    coord VARCHAR(50) NOT NULL,
    description VARCHAR(100),
    reg_date TIMESTAMP,
    UNIQUE(places_id)
);

create table item(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    description VARCHAR(100),
    reg_date TIMESTAMP,
    UNIQUE(name)
);

create table item_bought(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_user INT(6) UNSIGNED,
    id_pharmacy INT(6) UNSIGNED,
    id_item INT(6) UNSIGNED,
    price float(6,2) NOT NULL,
    bought_date date,
    reg_date TIMESTAMP,

    foreign key(id_user)    
       references user(id),

    foreign key(id_pharmacy)
       references pharmacy(id),

    foreign key(id_item)
       references item(id)
);

我在 JAVA 中构建的查询:

INSERT INTO item_bought (id_user, id_pharmacy, id_item, price, bought_date)
     SELECT user.id, pharmacy.id, item.id, 12.32, date('1999-02-24') 
     FROM user, pharmacy, item
     WHERE ( SELECT user.id, user.username, pharmacy.id,
   pharmacy.places_id, item.id, item.name 
         FROM item, pharmacy, item 
         WHERE user.username='jhon', pharmacy.places_id='id1', item.name='ibuprufen' )

这是我得到的错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Not unique table/alias: 'item'

感谢您的帮助:D

解决方案

根据 Gordon Linoff 的回答:

INSERT INTO item_bought (id_user, id_pharmacy, id_item, price, bought_date)
     SELECT (SELECT u.id FROM user u WHERE u.username = 'jhon'),
            (SELECT p.id FROM pharmacy p WHERE p.places_id = 'id1'),
            (SELECT i.id FROM item i WHERE i.name='ibuprufen'),
            (SELECT 13.22), (SELECT date('1999-02-12'));

更优雅!

【问题讨论】:

  • 你想做什么?您似乎不太可能希望将用户、药店和项目的完整笛卡尔乘积插入表中。示例数据和所需结果非常有用,尤其是在查询格式错误的情况下。注意:您的具体语法问题是WHERE 子句中的逗号。
  • 你试过使用 join 吗?

标签: mysql insert-select


【解决方案1】:

我想你想要的查询是:

INSERT INTO item_bought (id_user, id_pharmacy, id_item, price, bought_date)
     SELECT (SELECT u.id FROM user u WHERE u.username = 'jhon'),
            (SELECT p.id FROM pharmacy p WHERE p.places_id = 'id1'),
            (SELECT i.id FROM item i WHERE i.name='ibuprufen');

您的查询有很多错误——同一个表在 from 中多次出现,没有表别名,where 子句中的逗号,select 在返回多列和(可能)多行的标量上下文中而不是一个。此外,在where 子句中使用逗号是非常不好的做法。

【讨论】:

  • 谢谢,非常优雅的解决方案,只需添加 2 个带有价格和购买日期的选择。实际上,我进行了很多搜索以找到解决此问题的好方法,但从未找到过这样的东西。感谢 StackOverflow 的伟大骑士! :D
【解决方案2】:

问题似乎出在这一行:

FROM item, pharmacy, item

你有两次item。尝试删除一个。

【讨论】:

    【解决方案3】:

    在您的代码中,您在同一个查询中对同一个表调用了两次。这是错误的。应该是:

    INSERT INTO item_bought (id_user, id_pharmacy, id_item, price, bought_date)
         SELECT user.id, pharmacy.id, item.id, 12.32, date('1999-02-24') 
         FROM user, pharmacy, item
         WHERE ( SELECT user.id, user.username, pharmacy.id,
       pharmacy.places_id, item.id, item.name 
             FROM item, pharmacy
             WHERE user.username='jhon', pharmacy.places_id='id1', item.name='ibuprufen' )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-23
      • 2014-10-17
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 2018-02-25
      相关资源
      最近更新 更多