Gorod.dp.ua » Міські форуми / Городские форумы
Всього знайдено 20, показано з 1 по 20.

Тема: Вопрос по MySQL

  1. #1

    Типово Вопрос по MySQL

    Есть две таблицы абстрактные
    1: id, field1
    2: id, filed2

    Надо вставить в первую таблицу 10 записей и одновременно вставить связанные данные в другую таблицу. Приложение многопоточное, поэтому last_insert_id не подходит, max(id) имхо вообще "некрасиво" писать. Генерировать какой-то хеш и потом по нему селектить или по уникальным ключам тоже ИМХО не красиво и не верно.

    Кто, что посоветует?
    Востаннє редагував ziesto: 23.10.2011 о 21:52

  2. #2

    Реєстрація
    08 липень 2009
    Дописів
    1 617

    Типово

    Однако структура БД кривовата. Зачем вставлять данные во 2-ю таблицу, если они есть в первой?
    Но если так надо, то LAST_INSERT_ID
    Востаннє редагував tvn2009: 23.10.2011 о 18:31

  3. #3

    Типово

    Вам не показалось, что пример абстрактный? И к примеру, что в одной таблице может быть id name, во второй id property value и каких-то свойств может быть штук 20.

    Опять же таки я написал, что last_insert_id не подходит.

  4. #4

    Реєстрація
    08 липень 2009
    Дописів
    1 617

    Типово

    Цитата Допис від ziesto Переглянути допис
    Вам не показалось, что пример абстрактный? И к примеру, что в одной таблице может быть id name, во второй id property value и каких-то свойств может быть штук 20.

    Опять же таки я написал, что last_insert_id не подходит.
    А чем last_insert_id не подходит? (Ну кроме того, что в высоконагруженных ресурсах может не тот ID вернуть)

    а вообще можно select max (id) и ID формировать самому (id+1).
    Только нужно проверять, чтобы сессия или куки в момент select и в момент insert совпадали
    Востаннє редагував tvn2009: 23.10.2011 о 20:11

  5. #5
    Модератор Аватар для turist_ua
    Реєстрація
    01 жовтень 2006
    Звідки Ви
    Дніпро
    Дописів
    16 105

    Типово

    Решение абстрактных задач порождает абстрактные ответы. ИМХО в любой таблице должен быть уникальный ключ строки, в структуре ТС его нет во второй таблице. По-этому я бы преобразовал структуру таблицы к виду:

    prod_id, name
    option_id, prod_id, name
    Не забудь сделать связку по внешнему ключу для сохранения целостности данных.

    А там уже можно вставлять как угодно - если интересует быстродействие то просто сравнить разные варианты.

  6. #6

    Реєстрація
    08 липень 2009
    Дописів
    1 617

    Типово

    Цитата Допис від turist_ua Переглянути допис
    Решение абстрактных задач порождает абстрактные ответы. ИМХО в любой таблице должен быть уникальный ключ строки, в структуре ТС его нет во второй таблице. По-этому я бы преобразовал структуру таблицы к виду:

    prod_id, name
    option_id, prod_id, name
    Не забудь сделать связку по внешнему ключу для сохранения целостности данных.

    А там уже можно вставлять как угодно - если интересует быстродействие то просто сравнить разные варианты.
    Бывает, что нужно в момент создания записи в основной таблице, создать запись(и) в дополнительной таблице (например характеристики товара или еще что-то)... В основной таблице автоинкремент, а вот что вставлять в дополнительную... Приходится вычислять значение только что добавленной записи, чтобы не добавлять дополнительные (ненужные) поля, генерить идентификаторы средствами не SQL и по ним связывать таблицы.

  7. #7
    Модератор Аватар для turist_ua
    Реєстрація
    01 жовтень 2006
    Звідки Ви
    Дніпро
    Дописів
    16 105

    Типово

    Цитата Допис від tvn2009 Переглянути допис
    Бывает, что нужно в момент создания записи в основной таблице, создать запись(и) в дополнительной таблице (например характеристики товара или еще что-то)... В основной таблице автоинкремент, а вот что вставлять в дополнительную... Приходится вычислять значение только что добавленной записи, чтобы не добавлять дополнительные (ненужные) поля, генерить идентификаторы средствами не SQL и по ним связывать таблицы.
    я в целом понимаю что надо ТС, но он задачу описал не полностью - потому и ответить сложно. Ну а методы вычисления значений последнего индекса ты уже написал.

  8. #8
    Аватар для Dnepr
    Реєстрація
    28 лютий 2008
    Дописів
    16 004

    Типово

    Господа, какой last_insert_id, какой max(id)?? Вы совсем с многопоточными задачами не работали что ли? Правильно только через триггеры.

    DELIMITER |
    CREATE TRIGGER copy_data BEFORE INSERT ON table1
    FOR EACH ROW BEGIN
    INSERT INTO `table2` SET `table2`.id = NEW.id, `table2`.field1 = NEW.field1;
    END;
    |
    DELIMITER ;

  9. #9

    Типово

    Цитата Допис від tvn2009 Переглянути допис
    Бывает, что нужно в момент создания записи в основной таблице, создать запись(и) в дополнительной таблице (например характеристики товара или еще что-то)... В основной таблице автоинкремент, а вот что вставлять в дополнительную... Приходится вычислять значение только что добавленной записи, чтобы не добавлять дополнительные (ненужные) поля, генерить идентификаторы средствами не SQL и по ним связывать таблицы.
    Именно такая задача и стоит.

  10. #10
    Аватар для Dnepr
    Реєстрація
    28 лютий 2008
    Дописів
    16 004

    Типово

    Цитата Допис від ziesto Переглянути допис
    Именно такая задача и стоит.
    Ответ я дал выше, триггер на апдейт думаю напишите сами по аналогии.

  11. #11

    Типово

    Цитата Допис від turist_ua Переглянути допис
    Решение абстрактных задач порождает абстрактные ответы. ИМХО в любой таблице должен быть уникальный ключ строки, в структуре ТС его нет во второй таблице. По-этому я бы преобразовал структуру таблицы к виду:

    prod_id, name
    option_id, prod_id, name
    Не забудь сделать связку по внешнему ключу для сохранения целостности данных.

    А там уже можно вставлять как угодно - если интересует быстродействие то просто сравнить разные варианты.
    Это был лишь пример, чтобы сформулировать суть, таблицы совсем иные и полей в них намного больше.

  12. #12

    Типово

    Цитата Допис від Dnepr Переглянути допис
    Ответ я дал выше, триггер на апдейт думаю напишите сами по аналогии.
    Пока писал еще не было вашего поста, спасибо за ответ, вроде то что надо.
    Востаннє редагував ziesto: 23.10.2011 о 22:02

  13. #13

    Типово

    Цитата Допис від Dnepr Переглянути допис
    Ответ я дал выше, триггер на апдейт думаю напишите сами по аналогии.
    Не совсем понятно как это работает, что такое триггер я понимаю.

    Давайте возьмем конретный пример, есть таблица 1) id name 2) id engine
    В первой таблице id - auto increment

    Нужно вставить в первую таблицу название авто Деу, во вторую, объемы двигателей, которые бывают 1.4, 1.5, 1.6

    INSERT INTO table1 (name) VALUES ('Daewoo');
    INSERT INTO table2 VALUES (daewoo_id, '1.4'),(daewoo_id, '1.5'),(daewoo_id, '1.6')

    Типо такого.

    Как именно мне нужно будет правильно написать конструкцию INSERT?

  14. #14
    Модератор Аватар для turist_ua
    Реєстрація
    01 жовтень 2006
    Звідки Ви
    Дніпро
    Дописів
    16 105

    Типово

    Цитата Допис від Dnepr Переглянути допис
    Господа, какой last_insert_id, какой max(id)?? Вы совсем с многопоточными задачами не работали что ли? Правильно только через триггеры.
    если вся логика на стороне сервера БД - т.е. на хранимых процедурах, например - то почему бы и нет.

    А если логика на стороне сервера пхп (как я изначально и думал), то можно добавить timestamp метку для добавленного товара и потом уже по этой метке определить ID добавленного товара. Для невероятно нагруженных проектов есть microtime.

  15. #15

    Типово

    Цитата Допис від turist_ua Переглянути допис
    если вся логика на стороне сервера БД - т.е. на хранимых процедурах, например - то почему бы и нет.

    А если логика на стороне сервера пхп (как я изначально и думал), то можно добавить timestamp метку для добавленного товара и потом уже по этой метке определить ID добавленного товара. Для невероятно нагруженных проектов есть microtime.
    У меня win приложение + я все равно убежден, что не верно, что-то вставлять, а потом по каким-то уникальным полям селектить, должен быть способ, сразу вставлять данные в обе таблицы.

  16. #16
    Модератор Аватар для turist_ua
    Реєстрація
    01 жовтень 2006
    Звідки Ви
    Дніпро
    Дописів
    16 105

    Типово

    Цитата Допис від ziesto Переглянути допис
    У меня win приложение + я все равно убежден, что не верно, что-то вставлять, а потом по каким-то уникальным полям селектить, должен быть способ, сразу вставлять данные в обе таблицы.
    ну вот тебе триггер предложили, который решает поставленную задачу.

    А чем вызван выбор mysql как сервера баз данных для вин-приложения?

  17. #17
    Аватар для Dnepr
    Реєстрація
    28 лютий 2008
    Дописів
    16 004

    Типово

    Цитата Допис від ziesto Переглянути допис
    Не совсем понятно как это работает, что такое триггер я понимаю.

    Давайте возьмем конретный пример, есть таблица 1) id name 2) id engine
    В первой таблице id - auto increment

    Нужно вставить в первую таблицу название авто Деу, во вторую, объемы двигателей, которые бывают 1.4, 1.5, 1.6

    INSERT INTO table1 (name) VALUES ('Daewoo');
    INSERT INTO table2 VALUES (daewoo_id, '1.4'),(daewoo_id, '1.5'),(daewoo_id, '1.6')

    Типо такого.

    Как именно мне нужно будет правильно написать конструкцию INSERT?
    Ну как бы очевидно..
    DELIMITER |
    CREATE TRIGGER copy_data BEFORE INSERT ON table1
    FOR EACH ROW BEGIN
    INSERT INTO `table2` SET `table2`.id = NEW.id, `table2`.`engine` = "1.4";
    INSERT INTO `table2` SET `table2`.id = NEW.id, `table2`.`engine` = "1.5";
    INSERT INTO `table2` SET `table2`.id = NEW.id, `table2`.`engine` = "1.6";
    END;
    |
    DELIMITER ;

  18. #18

    Типово

    Теперь я совсем запутался, триггер - это хранимая процедура, при создании триггера он будет висеть в памяти.

    Мне за раз нужно вставить, скажем, 10 записей. INSERT INTO `table1` (name) VALUES ('DAEWOO'),('BMW'),('KIA'),('OPEL') и т.д. и к каждой машине добавить разный список движков. Т.е. вы предлагаете создать 10 триггеров, а потом их удалить? О_о

  19. #19

    Типово

    Цитата Допис від turist_ua Переглянути допис
    ну вот тебе триггер предложили, который решает поставленную задачу.

    А чем вызван выбор mysql как сервера баз данных для вин-приложения?
    Есть сайт PHP + MySQL, нужно обрабатывать много данных и сохранять их в БД.

  20. #20
    Аватар для Dnepr
    Реєстрація
    28 лютий 2008
    Дописів
    16 004

    Типово

    Цитата Допис від ziesto Переглянути допис
    Т.е. вы предлагаете создать 10 триггеров, а потом их удалить? О_о
    Таких глупостей я вам не предлагал, для начала почитайте как использовать IF. А вообще правильный вопрос обычно содержит половину ответа. Откуда у вас берется соответствие объемов двигателя названию бренда?

    Чувствую что плаваете, чуток разжую..

    Триггер, вызывает процедуру которая разбирает что вставлять:
    DELIMITER |
    CREATE TRIGGER copy_data BEFORE INSERT ON table1
    FOR EACH ROW BEGIN
    CALL `inser_eng` (NEW.id, NEW.name);
    END;
    |
    DELIMITER ;
    Из триггера вынес для красоты и универсальности, в принципе и в нем можно разобрать.

    И процедура которая будет вызываться триггером при вставке каждой записи и в зависимости от ТМ вставлять объемы движков. В данном примере объемы захаркожены, но очевидно что их можно выбрать и из какой-то шаблонной таблицы.

    CREATE DEFINER=`root`@`localhost` PROCEDURE `inser_eng`(IN `inId` INT, IN `inTM` VARCHAR(50))
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
    BEGIN

    IF (inTM = 'daewoo') THEN
    INSERT INTO `table2` (`id`, `engine`)
    SELECT inId,'1.4'
    UNION
    SELECT inId, '1.5'
    UNION
    SELECT inId, '1.6';
    END IF;

    IF (inTM = 'bmw') THEN
    INSERT INTO `table2` (`id`, `engine`)
    SELECT inId,'2.0'
    UNION
    SELECT inId, '2.5'
    UNION
    SELECT inId, '3.0';
    END IF;

    END
    Востаннє редагував Dnepr: 23.10.2011 о 23:47

Bookmarks

Bookmarks

Ваші права у розділі

  • Ви НЕ можете створювати нові теми
  • Ви НЕ можете відповідати у темах
  • Ви НЕ можете прикріплювати вкладення
  • Ви не можете редагувати свої повідомлення
  •  
  Головна | Афіша | Новини | Куди піти | Про місто | Фото | Довідник | Оголошення
Контакти : Угода з користивачем : Політика конфіденційності : Додати інформацію
Главная страница сайта  
copyright © gorod.dp.ua.
Всі права захищені. Використання матеріалів сайту можливо тільки з дозволу власника.
Про проєкт :: Реклама на сайті