|
DROP TABLE IF EXISTS `myTable`; |
|
|
|
CREATE TABLE `myTable` ( |
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Primary Key', |
|
`version` int(11) NOT NULL DEFAULT 0 COMMENT 'Version', |
|
`title` varchar(32) NOT NULL COMMENT 'Title', |
|
`description` varchar(1024) DEFAULT NULL COMMENT 'Description', |
|
`deleted_at` datetime DEFAULT NULL COMMENT 'Record deleted at', |
|
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Record created at' |
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1; |
|
|
|
ALTER TABLE `myTable` |
|
ADD PRIMARY KEY (`id`, `version`) USING BTREE, |
|
ADD KEY `i_title` (`title`); |
|
|
|
-- Get current version |
|
|
|
CREATE OR REPLACE VIEW vMyTableCurrentVersion AS |
|
SELECT |
|
`id` |
|
, MAX(`version`) AS `version` |
|
, MIN(`created_at`) AS `created_at` |
|
FROM `myTable` |
|
GROUP BY `id`; |
|
|
|
-- Get all records (include deleted records) |
|
|
|
CREATE OR REPLACE VIEW vMyTableAll AS |
|
SELECT |
|
T.id |
|
, T.version |
|
|
|
, T.title |
|
, T.description |
|
|
|
, T.deleted_at |
|
, _T.created_at |
|
, T.created_at AS `updated_at` |
|
FROM |
|
`myTable` AS T |
|
INNER JOIN vMyTableCurrentVersion AS _T ON |
|
T.id = _T.id |
|
AND T.version = _T.version; |
|
|
|
-- Get records |
|
|
|
CREATE OR REPLACE VIEW vMyTable AS |
|
SELECT * |
|
FROM `vMyTableAll` |
|
WHERE `deleted_at` IS NULL; |
|
|
|
-- Triggers & Validations |
|
|
|
DROP PROCEDURE IF EXISTS myTable_uk_title; |
|
DROP TRIGGER IF EXISTS myTable_insert_uk_title; |
|
DROP TRIGGER IF EXISTS myTable_update_uk_title; |
|
|
|
DELIMITER // |
|
|
|
CREATE PROCEDURE myTable_uk_title(id INT, title VARCHAR(32)) BEGIN |
|
IF ( |
|
SELECT COUNT(*) |
|
FROM vMyTable AS T |
|
WHERE |
|
T.id <> id |
|
AND T.title = title |
|
) > 0 THEN |
|
SIGNAL SQLSTATE '45000' |
|
SET MESSAGE_TEXT = 'Duplicated "title"', MYSQL_ERRNO = 1000; |
|
END IF; |
|
END // |
|
|
|
CREATE TRIGGER myTable_insert_uk_title BEFORE INSERT ON myTable |
|
FOR EACH ROW |
|
BEGIN |
|
CALL myTable_uk_title(NEW.id, NEW.title); |
|
END // |
|
|
|
CREATE TRIGGER myTable_update_uk_title BEFORE UPDATE ON myTable |
|
FOR EACH ROW |
|
BEGIN |
|
CALL myTable_uk_title(NEW.id, NEW.title); |
|
END // |
|
|
|
DELIMITER ; |