1

テーブルに行を挿入しようとしていますが、そのテーブルには 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'));

よりエレガントに!

4

3 に答える 3

1

問題は次の行のようです。

FROM item, pharmacy, item

あなたはitem2回持っています。1つ削除してみてください。

于 2015-06-05T02:02:34.087 に答える
1

あなたのコードでは、同じクエリで同じテーブルを 2 回呼び出しています。違います。そのはず:

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' )
于 2015-06-05T02:04:14.363 に答える
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、1つではなく複数の列と(おそらく)複数の行を返すスカラーコンテキストにあります。さらに、where句でコンマを使用することは非常に悪い習慣です。

于 2015-06-05T02:08:28.210 に答える