LINUX.ORG.RU
ФорумAdmin

MySQL Cluster и имена constraint

 , , , ndb


0

1

Приветствую, интересная штука есть в mysql - имена констрейнтов должны быть глобально уникальными, про это явно пишут тут:

The CONSTRAINT symbol value, if defined, must be unique in the database. A duplicate symbol results in an error similar to: ERROR 1005 (HY000): Can’t create table ‘test.fk1’ (errno: 121).

Но в MySQL Cluster (ndb) это не проблема и у меня под рукой кластер с десятком таблиц с одинаковым именем констрейнта. Не смог найти никаких упоминаний этой «фичи» нигде, может кто-то что-то знает и может прояснить ситуацию?

По-идее должно быть упомянуто тут, но нет: https://dev.mysql.com/doc/mysql-cluster-excerpt/5.6/en/mysql-cluster-limitations-syntax.html

★★★★★

Последнее исправление: loz (всего исправлений: 2)

Ответ на: комментарий от Rx0

Что он делает я примерно понимаю, вопрос в том почему в одном случае они обязательно глобально-уникальные а в другом - нет?

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

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

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

Хорошо, ты сейчас говоришь про то что оно делает, вопрос почему имя должно быть уникальным?

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

Объяснения не нашел, только требование:

Basically, you need to give your prjId constraint name a unique name in the last table. Constraint/foreign key names are global to a database, so they cannot be reused in different tables

Вопрос - почему это работает в MySQL Cluster?

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

почему это работает в MySQL Cluster?

Ну, не факт что работает, может просто не наступал на это? Напиши тестовый селект что бы гарантированно проверить.

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

Так в том и прикол что наступал,

> select count(distinct(TABLE_NAME)) from information_schema.table_constraints where CONSTRAINT_NAME='fk_currency_id';
11
loz ★★★★★
() автор топика
Ответ на: комментарий от Rx0

Не уверен что это так работает:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOREIGN KEY (`currency_id`)'

На строчке

CONSTRAINT_NAME `fk_currency_id` UNIQUE FOREIGN KEY (`currency_id`)
loz ★★★★★
() автор топика
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от loz

Так в таблице должен быть UNIQUE:

Пример:

CREATE TABLE suppliers (
    supplier_id INT AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    phone VARCHAR(15) NOT NULL UNIQUE,
    address VARCHAR(255) NOT NULL,
    PRIMARY KEY (supplier_id),
    CONSTRAINT uc_name_address UNIQUE (name , address)
);
Rx0
()
Ответ на: комментарий от Rx0

Подожди ну Unique Constraint ведь чтобы у меня значение было уникальным правильно? У меня же проблема с именем самого констрейнта.

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

FOREIGN не создает индексов

Зависит от реализации, в мускуле создаёт. foreign keys

MySQL requires indexes on foreign keys and referenced keys … In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от loz

Да мы немного в сторону пошли.

Это так, для справки:

Primary Key

 - Primary key cannot have a NULL value.
 - Each table can have only one primary key.
 - By default, Primary key is clustered index, and the data in database table is physically organized in the sequence of clustered index.
 - Primary key can be related to another tables as a Foreign Key.
 - We can generate ID automatically with the help of Auto Increment field.
 - Primary key supports Auto Increment value.
 - We can define Primary key constraint on temporary table and table variable.
 - We can't delete primary key value from the parent table which is used as a foreign key in child table.
To delete we first need to delete that primary key value from the child table.

Unique Key

 - Unique Constraint may have a NULL value.
 - Each table can have more than one Unique Constraint.
 - By default, Unique key is a unique non-clustered index.
 - Unique Constraint can not be related with another table's as a 
Foreign Key.

Foreign Key

 - Foreign key is a field in the table that is Primary key in another table.
 - Foreign key can accept multiple null value.
 - Foreign key do not automatically create an index, clustered or non-clustered. You can manually create an index on foreign key.
- We can have more than one foreign key in a table.
 - Foreign keys do not automatically create an index, clustered or non-clustered. You must manually create an index on foreign keys.
 - There are actual advantages to having a foreign key be supported with a clustered index, but you get only one per table. What's the advantage? If you are selecting the parent plus all child records, you want the child records next to each other. This is easy to accomplish using a clustered index.
 - Having a null foreign key is usually a bad idea instead of NULL  referred to as "orphan record".
 - We can’t define foreign key constraint on temporary table or table variable.
 - We can delete the foreign key value from the child table even though that refers to the primary key of the parent table.
Rx0
()
Ответ на: комментарий от loz

У меня же проблема с именем самого констрейнта.

Перепроверь таблицы, у тебя точно нет путаницы или ошибки с именем констрейнта?

Rx0
()

кластер с десятком таблиц с одинаковым именем констрейнта

Т.е. в разных таблицах с разными ключами в одной и той же реплике? Или как?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Зависит от реализации

Вот именно. И муська в разных версиях по разному себя вела. Поэтому лучше не заморачиваться, а самому создавать. Надежнее будет :)

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

Не особо знаю про реплики, есть кластер, в нем таблицы, в нескольких одинаковые имена констрейнта.

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

Да точно, MySQL не может загрузить дамп из-за этой ошибки :) Непонятно почему работает в MySQL Cluter.

loz ★★★★★
() автор топика
Ответ на: комментарий от Rx0
Repo couldn't be loaded: ERROR 1022 (23000) at line 529 in file: 'schema.sql': Can't write; duplicate key in table 

‘countries’

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

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

Если Вы спрашиваете по причине, что эти constraints мешают Вам выполнять действия по импорту/экспорту данных, то их можно отключить на время выполенения скриптов:

SET FOREIGN_KEY_CHECKS=0; выключает

соответственно SET FOREIGN_KEY_CHECKS=1; включает проверку внешних ключей.

На кластере может выключено?

Rx0
()
Ответ на: комментарий от loz

5.7.27-ndb-7.6.11-cluster

Извини, затупил я… ) У меня везде 8.

MySQL Cluster 8.0.19 https://dev.mysql.com/downloads/cluster/

Я так и не понимаю что у тебя происходит. Как вариант для теста возьми последние версии.

Rx0
()
Ответ на: комментарий от loz

Duplicate foreign key constraint name ‘fk_currency_id’

Так и должно быть. Не понятно почему кластер это кушает. Возможно в 7.6 есть бажок. Проверь на восьмом кластере.

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