Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глючит LAST_INSERT_ID(), Быть такого не может 8-( 
:(
    Опции темы
Иль
Дата 3.10.2005, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Не знаете в чем причина может быть? Делаю стандартный пример из документации по SQL http://dev.mysql.com/doc/mysql/ru/example-foreign-keys.html в Windows в Денвере под MySQL 4.1.8-max и у меня получается глюк с LAST_INSERT_ID()
Здесь я привожу не полный пример, но в полном еще хуже (до 5 или 6 достигает значение поля owner, а должно быть максимум 2, ведь в таблице person будет всего 2 записи по примеру).
Код

CREATE DATABASE testic; # Это строка и следующая от меня, для тех кто захочет проверять в новой БД, а не имеющейся
USE testic;

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);


INSERT INTO person VALUES (NULL, 'Antonio Paz');

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());

А вот что получается
Код

mysql> select * from person;
+----+-------------+
| id | name        |
+----+-------------+
|  1 | Antonio Paz |
+----+-------------+
1 row in set (0.00 sec)

mysql> select * from shirt;
+----+---------+-------+-------+
| id | style   | color | owner |
+----+---------+-------+-------+
|  1 | polo    | blue  |     1 |
|  2 | dress   | white |     1 |
|  3 | t-shirt | blue  |     2 |
+----+---------+-------+-------+
3 rows in set (0.00 sec)

Вот в нижней выборке и в нижней строке в поле owner значение 2, но это что-то из области фантастики, ведь select LAST_INSERT_ID() выдавал 1 перед началом последнего insert. Я в тупике.
Может от того, что таблицы MyISAM, а не InnoDB?
Я конечно могу все сделать через внутреннюю переменную, но хотелось бы разобраться от чего такой глюк.

Это сообщение отредактировал(а) Иль - 3.10.2005, 18:06


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Ignat
Дата 3.10.2005, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Пояснения не понял вообще, а по коду всё корректно выполнено.


--------------------
Теперь при чем :P
PM   Вверх
Darhazer
Дата 3.10.2005, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 4
Всего: 29



Привет,
LAST_INSERT_ID возвращяеть id последнего Inserta
Код

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', LAST_INSERT_ID()),
(NULL, 'dress', 'white', LAST_INSERT_ID()),
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());

Здесь у тебя 3 Inserta
Первий LAST_INSERT_ID() возвращяеть id полученого при INSERT INTO person VALUES (NULL, 'Antonio Paz') (1), второй - полученого при (NULL, 'polo', 'blue', LAST_INSERT_ID()) (1), третий - при (NULL, 'dress', 'white', LAST_INSERT_ID()) (2)... если добавиш еще записей, то получиться 3, 4 и т.д. - каждий возвращяеть id из предишного insert-а, а то, что они в одной заявки не имеет значения

Это сообщение отредактировал(а) Darhazer - 3.10.2005, 18:10


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
Ignat
Дата 3.10.2005, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



А.... Въехал, что ты хотел. Придется с переменными извращаться. Ведь LAST_INSERT_ID() возвращает значение НЕЗАВИСИМО от того, в какую таблицу вставлена запись. Т.е. в 23 и 24 строке кода функция возвращает id записей таблицы `shirt`, а не `person`.
Добавлено @ 18:11
Darhazer, опередил smile


--------------------
Теперь при чем :P
PM   Вверх
Иль
Дата 3.10.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Ну как могу smile , видно имоции не обуздал. Совсем ничего непонятно?

Посмотрите на результат внизу
Код

|  3 | t-shirt | blue  |     2 |

в последнем поле никак не может быть двойки, тк перед INSERT INTO shirt VALUES (проверял) запрос select LAST_INSERT_ID() выдавал 1, поэтому во всех полях owner должна быть только 1.


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Darhazer
Дата 3.10.2005, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 4
Всего: 29



Цитата

в последнем поле никак не может быть двойки, тк перед INSERT INTO shirt VALUES (проверял) запрос select LAST_INSERT_ID() выдавал 1, поэтому во всех полях owner должна быть только 1.

Иль
перед INSERT INTO shirt VALUES есть только один insert и у него id 1
в INSERT INTO shirt VALUES делаеш 3 inserta и каждий меняеть id
(NULL, 't-shirt', 'blue', LAST_INSERT_ID());
здесь получаешь id от
(NULL, 'dress', 'white', LAST_INSERT_ID()),

Это сообщение отредактировал(а) Darhazer - 3.10.2005, 18:18


--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
Иль
Дата 3.10.2005, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Ничего себе, приехали. Ребята, это получается официальная документация не к черту!!!
Смотрите по ссылке в первом топе, что они там рисуют с SQL и что приводят в результате: В owner везде одни 1 и 2.
Ну да бог сними (ведь, халява, сэр)

Это еще цветочки, а как я "веселился", когда заполнял таблицы из файлов!!!
В Windows же строки оканчиваются "\r\n" (у Никсов '\n', у MAC '\n\r'), а у LOAD DATA LOCAL INFILE по умолчанию стоит "\n" и если вносятся строки в полях текстовых типов в которых не применяется автоматическая обрезка начальных и конечных пробелов (TRIM) (это ENUM, TEXT и др), то такая каша мала на экране получалась из-за не удаленного знака переноса каретки \r.
Добавлено @ 18:29
Darhazer, да это я с ответом Ignat опоздал. Понял, буду помнить.

Это сообщение отредактировал(а) Иль - 5.10.2005, 11:11


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Darhazer
Дата 3.10.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 429
Регистрация: 28.9.2005
Где: HellCity (Sofia, Bulgaria)

Репутация: 4
Всего: 29



Цитата
Ничего себе, приехали. Ребята, это получается официальная документация не к черту!!!
Смотрите по ссылке в первом топе, что они там рисуют с SQL и что приводят в результате: В owner везде одни 1 и 2.
Ну да бог сними (ведь, халява, сэр)

Это еще цветочки, а как я веселился, когда заполнял таблицы из файлов!!! В Windows же строки оканчиваются "\r\n", а у LOAD DATA LOCAL INFILE по умолчанию стоит "\n" и если строки в полях из нескольких слов с пробелами, то такая каша мала на экране получалась из-за знака переноса каретки \r.
Добавлено @ 18:29
Darhazer, да это я с ответом Ignat опоздал. Понял, буду помнить.

Может быт так било в ранних версиях.
Посмотри что написано в английской документации:
http://dev.mysql.com/doc/mysql/en/example-foreign-keys.html

Код

INSERT INTO person VALUES (NULL, 'Antonio Paz');

SELECT @last := LAST_INSERT_ID();

INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);



--------------------
I'm a wheel, I'm a wheel, I can roll, I can feel
But you can't stop me turning
'Cause I'm the sun, I'm the sun, I can move, I can run
But you'll never stom me burning
PM MAIL WWW ICQ YIM   Вверх
Иль
Дата 3.10.2005, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Вау, смех да и только. И зачем я поленился по ангийски читать...
Именно через переменную пользователя они и делают.
Урок на будующее, чтоб английские маны читал


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.