mysql中的“代替”触发器
Posted
技术标签:
【中文标题】mysql中的“代替”触发器【英文标题】:"Instead of" Triggers in mysql 【发布时间】:2014-08-24 07:48:03 【问题描述】:我有一个客户。
CREATE TABLE `customer` (
`cNic` VARCHAR(50) NOT NULL DEFAULT '',
`cName` VARCHAR(100) NULL DEFAULT NULL,
`cAddress` VARCHAR(500) NULL DEFAULT NULL,
`cTp` VARCHAR(50) NULL DEFAULT NULL,
`cEmail` VARCHAR(50) NULL DEFAULT NULL,
`creditLimit` DOUBLE NULL DEFAULT NULL,
`CustomerStatus` INT(11) NULL DEFAULT '0',
PRIMARY KEY (`cNic`)
)
当向此客户表添加新行时,如果新行的 cNic
(主键)已在客户表中,我想与另一行更新现有(旧)行字段。 (Update customer set cName='NewName' where cNic = 'enteredNic'
)。
否则(如果cNic
不在表中)插入新行。我知道我可以使用 instead of
触发器在 mssql 中执行此操作。有没有办法在mysql中做到这一点。
【问题讨论】:
【参考方案1】:MySQL 没有代替触发器,但它确实有 REPLACE 和 INSERT...ON DUPLICATE KEY UPDATE(请参阅文档)。
另见我对"INSERT IGNORE" vs "INSERT ... ON DUPLICATE KEY UPDATE"的回复
【讨论】:
【参考方案2】:另一件值得注意的事情是MySQL
中的视图是可更新的,这意味着您对视图的插入或更新语句将自动在您的基表上运行。当然,前提是您的插入或更新操作不会造成任何歧义。
例如,您有一个表R(A, B)
,它有一个元组(1, 2)
。视图V(A)
是(1)
。如果将(10)
添加到V
,则会导致歧义,因为MySQL
不知道应该在基表中插入(10, 1)
或(10, 2)
或(10, NULL)
。
更多信息here
【讨论】:
以上是关于mysql中的“代替”触发器的主要内容,如果未能解决你的问题,请参考以下文章