【问题标题】:From MySQL to Oracle (NOW() and autoincrement ID)从 MySQL 到 Oracle(NOW() 和自动增量 ID)
【发布时间】:2011-10-22 23:13:34
【问题描述】:

我真的不知道怎么问这个,但是......代码会帮助我:

/**
 * Languages table definition
 */
DROP TABLE IF EXISTS `languages`;
CREATE TABLE `languages`
(
    -- Common:
    `id`      INTEGER    NOT NULL AUTO_INCREMENT                COMMENT 'Unique registry identifier',
    `created` TIMESTAMP  NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Registry creation TIMESTAMP',
    `updated` TIMESTAMP  NOT NULL DEFAULT NOW() ON UPDATE NOW() COMMENT 'Registry last update TIMESTAMP',
    `active`  BOOLEAN    NOT NULL DEFAULT TRUE                  COMMENT 'Virtual deletion flag',
    PRIMARY KEY (`id`),
    -- /Common
    `language_id`   INTEGER(2)  UNSIGNED NOT NULL COMMENT 'Language identifier',
    `language_code` VARCHAR(2)           NOT NULL COMMENT 'ISO 639-1 Code',
    `language_name` VARCHAR(20)          NOT NULL COMMENT 'Language name',
    -- Indexes
    UNIQUE KEY `language_id` (`language_id`)
) ENGINE=InnoDB CHARACTER SET 'latin1' COLLATE 'latin1_general_ci';

/**
 * Updates multilang field to UTF-8
 */
ALTER TABLE `languages` MODIFY `language_name` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

/**
 * Assigns the current TIMESTAMP to the created field without user input
 */
CREATE TRIGGER `insert_languages` BEFORE INSERT ON `languages`
    FOR EACH ROW
SET NEW.created = NOW();

/* Insert a record */
INSERT INTO languages(language_id, language_code, language_name) VALUES(10, 'es', 'Español');

/* Update that record (after a few seconds) */
UPDATE languages SET language_name = 'Español (España)' WHERE language_id = 10;

在检索 * WHERE language_id = 10 时,会收到两个不同的时间戳,而无需显式触摸 TIMESTAMP 字段,插入时我也不需要包含 ID。问题是:如何在 Oracle 中创建相同的行为?

【问题讨论】:

    标签: mysql oracle timestamp auto-increment


    【解决方案1】:
    1. 您需要使用带有BEFORE INSERT 触发器的序列来获得自动增量ID
    2. 您需要使用sysdatesystimestamplocaldate 来维护日期...而不是NOW() 也在触发器中,BEFORE INSERTBEFORE UPDATE

    【讨论】:

    • 这是一个自动递增序列/触发器示例 - jen.fluxcapacitor.net/geek/autoincr.html
    • @Phil 非常感谢,这对我帮助很大。 zerkms 我想我需要将所有内容都包含在一个触发器中,对吗?我的意思是日期和顺序。
    • @Edgar:如你所愿。两种解决方案(1 个或多个触发器)的工作方式相同
    • @zerkms 谢谢我的错误印象是“触发器最多,最慢”。
    • MySql 5.2: NOW() 在触发器中为我工作,因为我不使用 BEGIN...END。
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    相关资源
    最近更新 更多