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中的“代替”触发器的主要内容,如果未能解决你的问题,请参考以下文章

Postgres视图中的默认值,触发代替更新

SQL 代替触发器

插入视图,代替触发器,身份,多个表?

DB2 SQL 代替更新触发器

Triggers:代替/For Insert,哪个会先触发?

触发器中的 MySQL 错误“'NEW' 中的未知列”