2015-06-05 8 views
1

Я пытаюсь вставить строку в таблицу, эта таблица имеет 3 внешних ключа. Чтобы добраться до этих ключей, у меня есть «уникальные» filds для поиска.MySQL insert in select

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

Решение

На основании ответа Гордон Линофф:

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')); 

Гораздо более элегантно!

+0

Что вы пытаетесь сделать? Кажется маловероятным, что вам нужны полноценные декартовые продукты пользователей, аптек и предметов, вставленных в таблицу. Примеры данных и желаемые результаты очень полезны, особенно когда запрос настолько искажен. В качестве примечания: ваша конкретная проблема синтаксиса - это запятые в предложении WHERE. –

+0

Вы пробовали использовать соединение? – aizele

ответ

2

Я думаю, что запрос вы хотите:

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'); 

Ваш запрос имеет многочисленные ошибки - тот же стол несколько раз в из без таблицы псевдонимов, запятые в where, a select в скалярном контексте, который возвращает несколько столбцов и (возможно) несколько строк, а не один. Кроме того, использование запятых в статье where - очень плохая практика.

+0

Спасибо, очень изящное решение, просто пришлось добавить еще 2 варианта с ценой и buy_date. Я на самом деле много искал, чтобы найти хорошее решение для этого, так и не нашел ничего подобного. Спасибо, великий рыцарь из StackOverflow! : D – CiberWizZ

1

Проблема, кажется, эта линия:

FROM item, pharmacy, item 

Вы item дважды. Попробуйте удалить его.

1

В вашем коде вы вызываете два раза в одну и ту же таблицу в том же запросе. Это неверно. Оно должно быть:

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') 

 Смежные вопросы

  • Нет связанных вопросов^_^