2013-10-26 22 views
0

我有一个表名称Service(product,loca,from_agent,to_agent)。如何编写强制外键的触发器

产品的参考产品(PNO)

from_agent引用顾客(CNO)U驱动程序(drno)U航空公司(肛)

to_agent引用顾客(CNO)U驱动程序(drno)U航空公司(ANO)

CNO =客户编号这是另一种表名“客户”具有其他详细信息,如姓名,地址等

drno =驱动程序编号,其是具有其它细节,例如名称的另一个表名“驱动程序”,地址等

肛=航空公司数量是另一个表名“航空公司”,它具有其他细节,如depport,depttime,arrtime等。

想编写一个触发器,它会发力,在产品的外键在进行任何更改之前检查表。假设本地映射透明度

请帮帮忙,我只是了解触发器和分发数据库

+2

为什么使用触发器而不仅仅是明显的东西,如[外键约束](http:// dev .mysql.com/DOC/EN /创建表,外商keys.html)? – eggyal

+0

@eggyal - 我认为这是他的想法。 –

+0

因为我有一个碎片表,我想检查其他表上的主键,客户表中的cno存在,驱动程序表中的drno存在,并且ano实际存在于航空公司表中,如果用户尝试要更改任何其他字段,应触发触发器以提醒用户。我希望你明白我的意思 – JamesBond

回答

0

让我们想象一下数据库的店:项目,产品,品牌(对于为例:“黄标致自行车条纹”所以在这里引用为“标致自行车”的项目,作为一个品牌“标致”的。

CREATE TABLE IF NOT EXISTS `brands` (
`brandId` int(11) NOT NULL AUTO_INCREMENT, 
`brandName` varchar(30) NOT NULL, 
PRIMARY KEY (`brandId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ; 

CREATE TABLE IF NOT EXISTS `items` (
    `itemId` int(11) NOT NULL AUTO_INCREMENT, 
`generalProductId` int(11) NOT NULL, 

    PRIMARY KEY (`itemId`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

    CREATE TABLE IF NOT EXISTS `products` (
    `productId` int(11) NOT NULL AUTO_INCREMENT, 
    `productName` varchar(200) NOT NULL, 
    `productBrand` int(11) NOT NULL, 

    PRIMARY KEY (`productId`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; 

ALTER TABLE products ADD FOREIGN KEY(productBrand) REFERENCES brands(brandId) ON DELETE RESTRICT ON UPDATE  CASCADE; 
ALTER TABLE items ADD FOREIGN KEY(itemBrand) REFERENCES product(productBrand) ON DELETE RESTRICT ON UPDATE CASCADE; 

,你有一个外键约束,这使得项继承了产品指定的品牌,它继承本身从品牌。在这种情况下,如果你修改Name为一个特殊的BrandId,那么子表将会拥有这个特性。 RESTRICT意味着你不能打破链条和数据库将不允许你删除一个在其他地方引用的条目:)