ถามเกี่ยวกับ foreign key ครับ ปกติเขียนเว็ปใช้ foreign key ในฐานข้อมูลกันบ้างเปล่าครับ พอดีผมหนึ่งคนแหล่ะที่ไม่เคยใช้
foreign key integrity ไม่สามารถใช้ในตารางแบบ MYISAM ได้ครับ
ลองเปลี่ยนไปใช้ InnoDB แทนครับ
Date :
2009-10-30 12:47:37
By :
12123123
ยังไงครับ ขอคำอธิบายเพิ่มหน่อยครับ
Date :
2009-10-30 12:53:12
By :
xbeginner01
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
price DECIMAL,
PRIMARY KEY(category, id)) ENGINE=INNODB;
CREATE TABLE customer (id INT NOT NULL,
PRIMARY KEY (id)) ENGINE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY(no),
INDEX (product_category, product_id),
FOREIGN KEY (product_category, product_id) #....(1)
REFERENCES product(category, id)
ON UPDATE CASCADE ON DELETE RESTRICT,
INDEX (customer_id),
FOREIGN KEY (customer_id) #...(2)
REFERENCES customer(id)) ENGINE=INNODB;
สร้างตารางทั้งหมดเป็น innodb ครับ
ดูที่ (1) นะครับ มีการกำหนด integrity ON UPDATE CASCADE ถ้ามีการ update category=1,id=1 ไปเป็น category=2,id=1 ซึ่งเป็น pk ของตาราง product
แถวของตาราง product_order ที่มี product_category=1,product_id=1 จะเปลี่ยนตามไปเป็น product_category=2,id=1 ครับ
และที่ (1) มีการกำหนด integrity ON DELETE RESTRICT ก็จะทำให้เมื่อเราลบ category=1,id=1 ในตาราง product
แถวของตาราง product_order ที่มี product_category=1,product_id=1 จะไม่ถูกลบตาม (จะถูกลบตามเฉพาะ ON DELETE CASCADE)
แต่จะเกิด Error ขึ้นขณะทำการลบแถว category=1,id=1 ของตาราง product ว่าไม่สามารถลบแถวดังกล่าวได้เนื่องจากมีการอ้างอิงจากตารางอื่นมายังแถวนี้ สรุปก็คือจะไม่มีการลบเกิดขึ้นเลยครับ
หากต้องการลบแถว ที่มี category=1,id=1 ในตาราง product เราจะต้องลบแถวทั้งหมดที่มี product_category=1,product_id=1 ในตาราง product_order ทั้งหมดก่อนแล้วครับ
Date :
2009-10-30 13:14:18
By :
num
พูดเรื่องอะไรกัน ไม่รู้เรื่องเลย
Date :
2009-10-30 14:20:36
By :
tingtongkub
โอ่ เข้าใจแล้วครับ ขอบคุณ คุณ num มากครับ ที่อธิบายซะละเอียดเลย
ขอถามอีกข้อครับ index นี้คือไรหรอ
Date :
2009-10-30 14:22:41
By :
xbeginner01
ปกติในการ search ข้อมูลที่เป็น primary key จะ search ได้เร็วครับ
SELECT * FROM tb WHERE tb_id LIKE '100%';
แต่บางครั้งเราจำเป็นต้อง search ข้อมูลในฟิลด์อื่นๆ (มักจะทำฟิลด์เป็น index กับฟิลด์ที่มีการ search บ่อย)
อาจจะเสียพื้นที่ในการเก็บโครงสร้าง index เพิ่มขึ้น แต่ก็จะช่วยให้ search ฟิลด์นั้นได้เร็วขึ้นครับ
อ่านเพิ่มเติมที่นี่ครับ
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
Date :
2009-10-30 15:06:52
By :
num
customer
CREATE TABLE `customer` (
`CustomerID` varchar(4) NOT NULL,
`Name` varchar(50) NOT NULL,
`Email` varchar(50) NOT NULL,
`CountryCode` varchar(2) NOT NULL,
`Budget` double NOT NULL,
`Used` double NOT NULL,
PRIMARY KEY (`CustomerID`)
) ENGINE=InnoDB;
INSERT INTO `customer` VALUES ('C001', 'Win Weerachai', '[email protected] ', 'TH', 1000000, 600000);
INSERT INTO `customer` VALUES ('C002', 'John Smith', '[email protected] ', 'EN', 2000000, 800000);
INSERT INTO `customer` VALUES ('C003', 'Jame Born', '[email protected] ', 'US', 3000000, 600000);
INSERT INTO `customer` VALUES ('C004', 'Chalee Angel', '[email protected] ', 'US', 4000000, 100000);
INSERT INTO `customer` VALUES ('C005', 'Weerachai Nukitram', '[email protected] ', 'TH', 2000000, 100000);
audit
CREATE TABLE `audit` (
`AuditID` int(4) NOT NULL,
`CustomerID` varchar(4) NOT NULL,
`Date` date NOT NULL,
`Used` double NOT NULL,
PRIMARY KEY (`AuditID`),
FOREIGN KEY (CustomerID) REFERENCES customer (CustomerID) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
INSERT INTO `audit` VALUES (1, 'C001', '2008-08-01', 100000);
INSERT INTO `audit` VALUES (2, 'C001', '2008-08-05', 200000);
INSERT INTO `audit` VALUES (3, 'C001', '2008-08-10', 300000);
INSERT INTO `audit` VALUES (4, 'C002', '2008-08-02', 400000);
INSERT INTO `audit` VALUES (5, 'C002', '2008-08-07', 100000);
INSERT INTO `audit` VALUES (6, 'C002', '2008-08-15', 300000);
INSERT INTO `audit` VALUES (7, 'C003', '2008-08-20', 400000);
INSERT INTO `audit` VALUES (8, 'C003', '2008-08-25', 200000);
INSERT INTO `audit` VALUES (9, 'C004', '2008-07-04', 100000);
INSERT INTO `audit` VALUES (10, 'C005', '2008-07-04', 200000);
MySQL Relation CasCade On Delete/On Update
Date :
2009-11-29 08:38:00
By :
webmaster
Load balance : Server 00