Mysql Foreign keys ?!?!?

7 отговора 303 прегледа
#1

Mysql Foreign keys ?!?!?

Малко взех че се поразрових из чудото mysql и наблюдавам меко казано странни неща,
дали бихте могли да ми обясните следното странно според мен поведение. Значи взимам чисто и просто от промерчетата на mysql нещата и пробвам следното нещо:

CREATE TABLE parent(id INT NOT NULL, PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE child(id INT, parent_id INT, INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCES parent(id)
ON DELETE SET NULL
) TYPE=INNODB;

така и сега интересното е че може съвсем спокойно да направя нещо от сорта на:
INSERT INTO child (parent_id) VALUES(34)l;

и то не ми се кара, приема го.

Правя подобно нещо на postgresql:

test=# create table test (id int not null primary key, name char(24));
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_pkey" for table "test"
CREATE TABLE
\d test
Table "public.test"
Column | Type | Modifiers
--------+---------------+-----------
id | integer | not null
name | character(24) |
Indexes:
"test_pkey" primary key, btree (id)

test=# insert into test (id, name) values(3, 'ceci');
INSERT 17147 1
test=# insert into test (id, name) values(3, 'ceci');
ERROR: duplicate key violates unique constraint "test_pkey"
test=# create table child (id int not null, next_name char(255), foreign key (id) references test(id));
CREATE TABLE
test=# insert into child (id, next_name) values(34, 'ddddd');
ERROR: insert or update on table "child" violates foreign key constraint "$1"
DETAIL: Key (id)=(34) is not present in table "test".
test=#

Така, та ми е интересно, какво изпускам да направя за да заработят FOREIGN KEYS в MYSQL по начин подобен на тези в PostgreSQL ?

Отговор
в отговор на ceci_ #2

Re: Mysql Foreign keys ?!?!?

възможно е ако не си си конфигурирал innodb (т.е. нямаш) таблиците ей така си стават myisam без изобщо да те предупредят

за повече такива странни поведения, може да видиш [линк]

mysql малко крие грешките (не бъг а фичър ;-))

Отговор
в отговор на ceci_ #3

Re: Mysql Foreign keys ?!?!?

mysql> INSERT INTO child (parent_id) VALUES(34);
ERROR 1216: Cannot add or update a child row: a foreign key constraint fails


mysql> SHOW CREATE TABLE child;

CREATE TABLE `child` (
`id` int(11) default NULL,
`parent_id` int(11) default NULL,
KEY `par_ind` (`parent_id`),
CONSTRAINT `0_16` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE SET NULL
) TYPE=InnoDB

Провери наистина дали таблицата ти е InnoDB
Може да не е пуснато.
mysql> SHOW VARIABLES LIKE "have_innodb";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_innodb | YES |
+---------------+-------+

salle.online.bg/sig
Отговор
в отговор на phpGuru #4

хайде да се хванем на бас ...

mysql> CREATE TABLE phpGuru (beer TINYINT) ENGINE=InnoDB;
Query OK, 0 rows affected, 1 warning (0.06 sec)

mysql> SHOW WARNINGS;
+---------+------+-------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------+
| Warning | 1265 | Using storage engine MyISAM for table 'phpGuru' |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT VERSION();
+-----------------------+
| VERSION() |
+-----------------------+
| 4.1.2-alpha-debug-log |
+-----------------------+
1 row in set (0.00 sec)

salle.online.bg/sig
Отговор
в отговор на salle #5

Re: хайде да се хванем на бас ...

:-) е да ама нали се сещаш, че никой (или почти никой) не ползва 4.1.2

а иначе и аз му казах, най-вероятно не си е пуснал innodb-то

Отговор
в отговор на phpGuru #6

Re: не се сещам :)

Като знам колко огромно количество Bug-ове вече сме поправили в 4.1 след като са ни изпратени на bugs.mysql.com май са доста тези дето го използват.

salle.online.bg/sig
Отговор
в отговор на ceci_ #7

10x на всички:)

Това беше проблема, пуснах си INODB-то и всичко си тръгна на 6 :)))
BTW доколкото пробвах да работя с blob-ове в 4.1 се работи значително по-лесно с тях :) докато в по-ранни версии нещо ама никак не ми хареса апи-то :)

Отговор
в отговор на ceci_ #8

Re: тук вече ме изненада ...

Честно казано не знам за какви проблеми с BLOB говориш, но ще ми е интересно да ги обсъдим.

Не знам просто защото почти не ми се е налагало да изолзвам BLOB

Кое API ползваш и откъде идва разликата?
Надявам се да се срещнем на 6-7ми март на

[линк]

salle.online.bg/sig
Отговор