14.1.18 CREATE TABLE Syntax
...
- 某些屬性並不適用於所有數據類型。 AUTO_INCREMENT僅適用於整數和浮點類型。 DEFAULT不適用於BLOB,TEXT,GEOMETRY和JSON類型。
...
CREATE TABLE warehouse (
bin VARCHAR(6) NOT NULL AUTO_INCREMENT, -- <- It's not possible
qty INT,
PRIMARY KEY(bin)
);
你可能有一些選擇,有一些注意事項:
- 如果
item
列必須嚴格按照序列(AUTO_INCREMENT),你可以在封裝存儲過程INSERT
邏輯:
例Rextester:
mysql> DROP PROCEDURE IF EXISTS `insert_inventory`;
Query OK, 0 rows affected (0.00 sec)
mysql> DROP TABLE IF EXISTS `warehouse`, `inventory`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `warehouse` (
-> `bin` VARCHAR(6) NOT NULL,
-> `qty` INT DEFAULT 1,
-> PRIMARY KEY(`bin`)
->);
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `inventory` (
-> `item` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
-> `name` VARCHAR(10),
-> PRIMARY KEY(`item`),
-> UNIQUE KEY(`name`)
->);
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TRIGGER `trg_ai_inventory` AFTER INSERT ON `inventory`
-> FOR EACH ROW
-> INSERT INTO `warehouse` (`bin`)
-> VALUES (NEW.`item`);
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE PROCEDURE `insert_inventory`(`_name` VARCHAR(10))
-> BEGIN
-> DECLARE `_item` INT DEFAULT (SELECT `item`
-> FROM `inventory`
-> WHERE `name` = `_name`);
-> IF `_item` IS NULL THEN
-> INSERT INTO `inventory` (`name`)
-> VALUES (`_name`);
-> ELSE
-> UPDATE `warehouse`
-> SET `qty` = `qty` + 1
-> WHERE `bin` = `_item`;
-> END IF;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CALL `insert_inventory`('hammer');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
+------+--------+
1 row in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 1 |
+-----+------+
1 row in set (0.00 sec)
mysql> CALL `insert_inventory`('hammer');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
+------+--------+
1 row in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 2 |
+-----+------+
1 row in set (0.00 sec)
mysql> CALL `insert_inventory`('pliers');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
| 2 | pliers |
+------+--------+
2 rows in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 2 |
| 2 | 1 |
+-----+------+
2 rows in set (0.00 sec)
忽略(舉例Rextester):
mysql> DROP TABLE IF EXISTS `warehouse`, `inventory`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `warehouse` (
-> `bin` VARCHAR(6) NOT NULL,
-> `qty` INT DEFAULT 1,
-> PRIMARY KEY(`bin`)
->);
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `inventory` (
-> `item` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
-> `name` VARCHAR(10),
-> PRIMARY KEY(`item`),
-> UNIQUE KEY(`name`)
->);
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER //
mysql> CREATE TRIGGER `trg_bi_inventory` BEFORE INSERT ON `inventory`
-> FOR EACH ROW
-> BEGIN
-> DECLARE `_item` INT DEFAULT (SELECT `item`
-> FROM `inventory`
-> WHERE `name` = NEW.`name`);
-> IF `_item` IS NOT NULL THEN
-> UPDATE `warehouse`
-> SET `qty` = `qty` + 1
-> WHERE `bin` = `_item`;
-> END IF;
-> END//
Query OK, 0 rows affected (0.00 sec)
mysql> DELIMITER ;
mysql> CREATE TRIGGER `trg_ai_inventory` AFTER INSERT ON `inventory`
-> FOR EACH ROW
-> INSERT INTO `warehouse` (`bin`)
-> VALUES (NEW.`item`);
Query OK, 0 rows affected (0.01 sec)
mysql> INSERT IGNORE `inventory` (`name`)
-> VALUES ('hammer');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
+------+--------+
1 row in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 1 |
+-----+------+
1 row in set (0.00 sec)
mysql> INSERT IGNORE `inventory` (`name`)
-> VALUES ('hammer');
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
+------+--------+
1 row in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 2 |
+-----+------+
1 row in set (0.00 sec)
mysql> INSERT IGNORE `inventory` (`name`)
-> VALUES ('pliers');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
| 3 | pliers |
+------+--------+
2 rows in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 2 |
| 3 | 1 |
+-----+------+
2 rows in set (0.00 sec)
ON DUPL ICATE KEY UPDATE(示例Rextester):
mysql> DROP TABLE IF EXISTS `warehouse`, `inventory`;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE `warehouse` (
-> `bin` VARCHAR(6) NOT NULL,
-> `qty` INT DEFAULT 1,
-> PRIMARY KEY(`bin`)
->);
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE `inventory` (
-> `item` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
-> `name` VARCHAR(10),
-> `count` INT DEFAULT 1,
-> PRIMARY KEY(`item`),
-> UNIQUE KEY(`name`)
->);
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TRIGGER `trg_ai_inventory` AFTER INSERT ON `inventory`
-> FOR EACH ROW
-> INSERT INTO `warehouse` (`bin`)
-> VALUES (NEW.`item`);
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TRIGGER `trg_au_inventory` AFTER UPDATE ON `inventory`
-> FOR EACH ROW
-> UPDATE `warehouse`
-> SET `qty` = `qty` + 1
-> WHERE `bin` = OLD.`item`;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `inventory` (`name`)
-> VALUES ('hammer')
-> ON DUPLICATE KEY UPDATE `count` = `count` + 1;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
+------+--------+
1 row in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 1 |
+-----+------+
1 row in set (0.00 sec)
mysql> INSERT INTO `inventory` (`name`)
-> VALUES ('hammer')
-> ON DUPLICATE KEY UPDATE `count` = `count` + 1;
Query OK, 2 rows affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
+------+--------+
1 row in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 2 |
+-----+------+
1 row in set (0.00 sec)
mysql> INSERT INTO `inventory` (`name`)
-> VALUES ('pliers')
-> ON DUPLICATE KEY UPDATE `count` = `count` + 1;
Query OK, 1 row affected (0.00 sec)
mysql> SELECT `item`, `name`
-> FROM `inventory`;
+------+--------+
| item | name |
+------+--------+
| 1 | hammer |
| 3 | pliers |
+------+--------+
2 rows in set (0.00 sec)
mysql> SELECT `bin`, `qty`
-> FROM `warehouse`;
+-----+------+
| bin | qty |
+-----+------+
| 1 | 2 |
| 3 | 1 |
+-----+------+
2 rows in set (0.00 sec)