LINUX.ORG.RU
решено ФорумAdmin

SQL запрос нормально выполняется в mysql, но не в mariadb

 , ,


0

1

Пытаюсь поднять dbmail, создал базу в mariadb 10, скармливаю ей шаблон таблиц, идущий вместе с пакетом, а он валится вот на этом запросе:

CREATE TABLE dbmail_auto_replies (                                                                                    
        user_idnr bigint(20) UNSIGNED DEFAULT '0' NOT NULL,
        start_date DATETIME NOT NULL,
        stop_date DATETIME NOT NULL,
        reply_body MEDIUMTEXT,
        INDEX user_idnr_index (user_idnr),
        FOREIGN KEY user_idnr_fk (user_idnr)
                REFERENCES dbmail_users (user_idnr) ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE InnoDB DEFAULT CHARSET=utf8;
Аргументирует тем, что ERROR 1005 (HY000) at line 401: Can't create table `dbmail`.`dbmail_auto_replies` (errno: 121 "Duplicate key on write or update"). При этом, в mysql 5.5 всё выполняется нормально. Я просмотрел список несовместимостей между mariadb и mysql, но ничего похожего своим профанским взглядом не увидел. Это баг, или нормальное поведение? Как подправить запрос, чтобы он работал в машке?

★★★★★

Погляди вывод «show engine innodb status» после ошибки, скорее всего имя внешнего ключа уже где-то используется.

blind_oracle ★★★★★
()
Ответ на: комментарий от Axon

Спецательно для тебя скачал сабж. В таблицах dbmail_auto_notifications и dbmail_auto_replies FK называются одинаково - user_idnr_fk. That's bad. Почему оно работает в мускуле - загадка, ибо:

If the CONSTRAINT symbol clause is given, the symbol value, if used, must be unique in the database. A duplicate symbol will result in an error similar to: ERROR 1005 (HY000): Can't create table 'test.#sql-211d_3' (errno: 121). If the clause is not given, or a symbol is not included following the CONSTRAINT keyword, a name for the constraint is created automatically.
(c) https://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html

Так что переименовывай один из них и всё. Разве что это нужно будет учитывать при апгрейдах, при накатывании изменений схемы. Ну и багрепорт им запили.

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

Так что переименовывай один из них и всё.

А оно работу dbmail не поломает?

Ну и багрепорт им запили.

Да, об этом уже подумал.

Axon ★★★★★
() автор топика
Ответ на: комментарий от blind_oracle

Нет, какое название у FK абсолютно до барабана - оно лишь для того, чтобы один от другого отличать.

Круть, спасибо. Пойду проверять и репортить.

Axon ★★★★★
() автор топика
Ответ на: комментарий от blind_oracle

Почему оно работает в мускуле - загадка

А я знаю почему - это говно просто проглатывает все ошибки. В ситуациях где постгрес скажет: «Атя-тя, готовь туза, маня!» мускуль просто промолчит, обрежет тебе вывод и ладно.

ritsufag ★★★★★
()
Ответ на: комментарий от ritsufag

Ну машка то по большей части клон мускуля. Постгресс это совсем другая песня.

Да и судя по докам, которые я выше приводил - оно не должно работать в мускуле.

blind_oracle ★★★★★
()
Ответ на: комментарий от anc

Ты путаешь мух с котлетами. Constraint primary key просто ограничивает значения в столбце уникальными значениями. Как и Unique индекс.

А в общем смысле индекс - это B-tree (или иного вида), который позволяет находить значения быстрее чем table scan. Чем тебе поможет FK в этом славном деле - мне совсем не ясно.

Если есть сомнения - поищи https://en.wikipedia.org/wiki/Foreign_key тут слово index :)

blind_oracle ★★★★★
()
Последнее исправление: blind_oracle (всего исправлений: 1)
Ответ на: комментарий от blind_oracle

Я конкретно про mysql говорю, имхо он создает автоматом. Хотя теперь уже меня сомнения стали брать.

anc ★★★★★
()
Ответ на: комментарий от blind_oracle

Во нашел такую хрень http://muff.kiev.ua/files/books/MySQL50LibraryProgrammerHoltzman.pdf
В ней говорят что:
«Для столбцов внешнего ключа автоматически создается индекс, поэтому проверки зна-
чений внешних ключей в ходе контроля целостности связи выполняются быстро.»

В другом месте: «The FOREIGN KEY clause specifies the columns in the child table that refers to primary key columns in the parent table. You can put a foreign key name after FOREIGN KEY clause or leave it to let MySQL to create a name for you. Notice that MySQL automatically creates an index with the foreign_key_name name.»

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

То, что оно в бесконечной своей заботе о юзере вдруг стало само делать индекс по целевому столбцу - просто очередной факт беспокойства о хомячках. Это не делает FK индексом. Причём, мне кажется, в версиях 4.х и начале 5 ветки оно так не делало, а просто отказывалось делать FK если нет индекса. Могу ошибаться.

blind_oracle ★★★★★
()
Последнее исправление: blind_oracle (всего исправлений: 1)
Ответ на: комментарий от blind_oracle

Для сведения, они не единственные кто так делает. Я все это к тому, что иногда переименование FK может быть и критично, нельзя однозначно говорить да ли нет.

anc ★★★★★
()
Ответ на: комментарий от anc

При DML операциях, которым занимается DBMail название индекса, как и ключа, до барабана, он в запросах не участвует.

А вот если какой-то DDL (апгрейд схемы с новой версией и т.п.), то уже да, может играть роль.

blind_oracle ★★★★★
()
Ответ на: комментарий от blind_oracle

Да кто ж его знает, может план свой строиться, не это конечно мало вероятно но все может быть.

anc ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.