MySQL FOREIGN i PRIMARY KEY problem
6 отговора
809 прегледа
MySQL FOREIGN i PRIMARY KEY problem
С две думи, във външния ключ мога да запиша стойности, които не съществуват като първичен ключ и MySQL-а не го отчита като грешка и стават бози. Някакви идеи?
ето как са направени връзките:
CREATE TABLE customers
(cust_id INT AUTO_INCREMENT,
...
PRIMARY KEY (cust_id));
CREATE TABLE orders
(ord_no TIMESTAMP(10) PRIMARY KEY,
cust_id INT NOT NULL,
...
FOREIGN KEY (cust_id) REFERENCES customers (cust_id) ON DELETE CASCADE);
ето как са направени връзките:
CREATE TABLE customers
(cust_id INT AUTO_INCREMENT,
...
PRIMARY KEY (cust_id));
CREATE TABLE orders
(ord_no TIMESTAMP(10) PRIMARY KEY,
cust_id INT NOT NULL,
...
FOREIGN KEY (cust_id) REFERENCES customers (cust_id) ON DELETE CASCADE);
Re: MySQL FOREIGN i PRIMARY KEY problem
mysql> INSERT INTO orders (cust_id) VALUES(1);
ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails
Това става при:
mysql> SELECT * FROM customers;
Empty set (0.00 sec)
и таблици
CREATE TABLE `orders` (
`ord_no` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`cust_id` int(11) NOT NULL default '0',
PRIMARY KEY (`ord_no`),
KEY `cust_id` (`cust_id`),
CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`cust_id`) REFERENCES `customers` (`cust_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `customers` (
`cust_id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
А таблиците ти какви са?
salle.online.bg/sig
ERROR 1216 (23000): Cannot add or update a child row: a foreign key constraint fails
Това става при:
mysql> SELECT * FROM customers;
Empty set (0.00 sec)
и таблици
CREATE TABLE `orders` (
`ord_no` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`cust_id` int(11) NOT NULL default '0',
PRIMARY KEY (`ord_no`),
KEY `cust_id` (`cust_id`),
CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`cust_id`) REFERENCES `customers` (`cust_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `customers` (
`cust_id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
А таблиците ти какви са?
salle.online.bg/sig
Re: MySQL FOREIGN i PRIMARY KEY problem
в какъв смисъл какви са? по принцип сравнително от скоро се зaнимавам с бази и все още си доизняснявам доста неща.
Re: MySQL FOREIGN i PRIMARY KEY problem
а ето какво става пък при мен:
mysql> insert into orders (cust_id) values (5);
Query OK, 1 row affected (0.00 sec)
като:
mysql> select * from customers;
Empty set (0.00 sec)
а таблиците са:
CREATE TABLE customers
(cust_id INT(11) AUTO_INCREMENT,
cust_fname VARCHAR(15) NOT NULL,
cust_mname VARCHAR(15),
cust_lname VARCHAR(15) NOT NULL,
cust_notes TEXT,
PRIMARY KEY (cust_id));
и
CREATE TABLE orders
(ord_no TIMESTAMP(10) DEFAULT 'NOW()' PRIMARY KEY,
cust_id INT(11) NOT NULL,
ord_date DATE DEFAULT 'CURDATE' NOT NULL,
ord_docs LONGTEXT NOT NULL,
ord_tr_lang VARCHAR(15),
ord_zaverki VARCHAR(30),
ord_notes TEXT,
ord_amount INT,
ord_status TEXT,
FOREIGN KEY (cust_id) REFERENCES customers (cust_id) ON DELETE CASCADE);
mysql> insert into orders (cust_id) values (5);
Query OK, 1 row affected (0.00 sec)
като:
mysql> select * from customers;
Empty set (0.00 sec)
а таблиците са:
CREATE TABLE customers
(cust_id INT(11) AUTO_INCREMENT,
cust_fname VARCHAR(15) NOT NULL,
cust_mname VARCHAR(15),
cust_lname VARCHAR(15) NOT NULL,
cust_notes TEXT,
PRIMARY KEY (cust_id));
и
CREATE TABLE orders
(ord_no TIMESTAMP(10) DEFAULT 'NOW()' PRIMARY KEY,
cust_id INT(11) NOT NULL,
ord_date DATE DEFAULT 'CURDATE' NOT NULL,
ord_docs LONGTEXT NOT NULL,
ord_tr_lang VARCHAR(15),
ord_zaverki VARCHAR(30),
ord_notes TEXT,
ord_amount INT,
ord_status TEXT,
FOREIGN KEY (cust_id) REFERENCES customers (cust_id) ON DELETE CASCADE);
Re: Концепцията Storage Engine - малко теория
MySQL от самото начало на съществуването си прилага на практика един от най-основните принципи на теорията на Релационните Бази Данни. А именно отделните нива на:
Съхраняване на данните
Обработка на данните
При MySQL има едно ядро което обработва цялата SQL част включително връзка с клиентите, обработка и оптимизация на заявките, което комуникира с т.нар. Хранилища на Данни (Storage Engines) които са отговорни само за съхраняване и съответно предоставяне на данните по заявка.
Т.е. MySQL поддържа различни хранилища за данни с различни характеристики. С тов получаваш свободата да избираш най-подходящото средство за конкретна задача.
От гледна точка на конкретна База Данни или Таблица те изглеждат като различни типове таблици.
Някои от тези хранилища поддържат Външни Ключове, други не.
Точно затова те попитах какви са ти таблиците и ти дадох пример с InnoDB таблици. InnoDB поддържа външни ключове, другите хранилища не.
CREATE TABLE `orders` (
...
) ENGINE=InnoDB
При повечето версии по подразбиране таблиците са създават като MyISAM а MyISAM не поддържа външни ключове и точно това е проблемът при теб. Ако искаш тази функционалност направи
ALTER TABLE tbl ENGINE=InnoDB;
Само че преди това провери какви са ти таблиците със
SHOW CREATE TABLE tbl;
Повече за стандартно поддържаните хранилища можеш да научиш от ръководството:
[линк]
Успех!
И ако нещо не разбираш питай
salle.online.bg/sig
Съхраняване на данните
Обработка на данните
При MySQL има едно ядро което обработва цялата SQL част включително връзка с клиентите, обработка и оптимизация на заявките, което комуникира с т.нар. Хранилища на Данни (Storage Engines) които са отговорни само за съхраняване и съответно предоставяне на данните по заявка.
Т.е. MySQL поддържа различни хранилища за данни с различни характеристики. С тов получаваш свободата да избираш най-подходящото средство за конкретна задача.
От гледна точка на конкретна База Данни или Таблица те изглеждат като различни типове таблици.
Някои от тези хранилища поддържат Външни Ключове, други не.
Точно затова те попитах какви са ти таблиците и ти дадох пример с InnoDB таблици. InnoDB поддържа външни ключове, другите хранилища не.
CREATE TABLE `orders` (
...
) ENGINE=InnoDB
При повечето версии по подразбиране таблиците са създават като MyISAM а MyISAM не поддържа външни ключове и точно това е проблемът при теб. Ако искаш тази функционалност направи
ALTER TABLE tbl ENGINE=InnoDB;
Само че преди това провери какви са ти таблиците със
SHOW CREATE TABLE tbl;
Повече за стандартно поддържаните хранилища можеш да научиш от ръководството:
[линк]
Успех!
И ако нещо не разбираш питай
salle.online.bg/sig
Re: Концепцията Storage Engine - малко теория
Благодаря ти много! Много ми помогна. Можеш ли да ми препоръчаш някаква литература за MySQL освен документацията? До сега съм учил единствено стандартния SQL, но това явно в случая е крайно недостатъчно