Use*_*841 9 mysql database-design
我有一个 MySQL 表,其中包含有关公司发票的信息。但是,这家公司有两个分公司,每个分公司都有独特的开票顺序;可以说是“意甲”和“意甲”。但是,这是一家公司,我不想创建两个发票表。相反,我想为一张表设置两个不同的自动增量。我知道这在技术上是不可能的,但我想这是其他人以前解决过的一个问题,所以我想知道这个问题是否有一个众所周知的“解决方案”?
我现在正在做的不是使用主键作为发票编号(这将是理想的),而是使用带有发票 ID 的辅助列,该列是手动递增的(嗯,使用 PHP 脚本,但它仍然不是自动的),通过检查该特定系列的最新发票。
这是我目前的设置:
CREATE TABLE `invoices` (
`id` mediumint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`invoicenumber` mediumint unsigned NOT NULL,
`branch` enum('A','B') NOT NULL,
`date` date NOT NULL,
`client` varchar(100) NOT NULL
) COMMENT='' ENGINE='InnoDB';
Run Code Online (Sandbox Code Playgroud)
要检查延迟发票,我运行:
SELECT MAX(invoicenumber+1) AS new_invoice_number FROM invoices WHERE branch = 'A'
Rol*_*DBA 13
您建议做的事情只能在三(3)个条件下完全使用 MySQL 完成
这是您的原始表格布局
CREATE TABLE `invoices` (
`id` mediumint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`invoicenumber` mediumint unsigned NOT NULL,
`branch` enum('A','B') NOT NULL,
`date` date NOT NULL,
`client` varchar(100) NOT NULL
) COMMENT='' ENGINE='InnoDB';
Run Code Online (Sandbox Code Playgroud)
基于我刚才提到的三个条件,这里是新提出的表格布局:
CREATE TABLE `invoices` (
`invoicenumber` mediumint unsigned NOT NULL auto_increment,
`branch` enum('A','B') NOT NULL,
`date` date NOT NULL,
`client` varchar(100) NOT NULL,
PRIMARY KEY (branch,invoicenumber)
) COMMENT='' ENGINE='MyISAM';
Run Code Online (Sandbox Code Playgroud)
这是通过示例数据和 SQL 的示例:
drop database if exists user1162541;
create database user1162541;
use user1162541
CREATE TABLE `invoices` (
`invoicenumber` mediumint unsigned NOT NULL auto_increment,
`branch` enum('A','B') NOT NULL,
`date` date NOT NULL,
`client` varchar(100) NOT NULL,
PRIMARY KEY (branch,invoicenumber)
) COMMENT='' ENGINE='MyISAM';
INSERT INTO invoices (branch,date,client) VALUES
('A',DATE(NOW()),'John'),
('B',DATE(NOW()),'Jack'),
('A',DATE(NOW()),'Jeff'),
('B',DATE(NOW()),'Joel'),
('A',DATE(NOW()),'Jane'),
('B',DATE(NOW()),'Joan'),
('A',DATE(NOW()),'June');
SELECT * FROM invoices ORDER BY branch,invoicenumber;
Run Code Online (Sandbox Code Playgroud)
在这里执行:
mysql> drop database if exists user1162541;
Query OK, 1 row affected (0.01 sec)
mysql> create database user1162541;
Query OK, 1 row affected (0.02 sec)
mysql> use user1162541
Database changed
mysql> CREATE TABLE `invoices` (
-> `invoicenumber` mediumint unsigned NOT NULL auto_increment,
-> `branch` enum('A','B') NOT NULL,
-> `date` date NOT NULL,
-> `client` varchar(100) NOT NULL,
-> PRIMARY KEY (branch,invoicenumber)
-> ) COMMENT='' ENGINE='MyISAM';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO invoices (branch,date,client) VALUES
-> ('A',DATE(NOW()),'John'),
-> ('B',DATE(NOW()),'Jack'),
-> ('A',DATE(NOW()),'Jeff'),
-> ('B',DATE(NOW()),'Joel'),
-> ('A',DATE(NOW()),'Jane'),
-> ('B',DATE(NOW()),'Joan'),
-> ('A',DATE(NOW()),'June');
Query OK, 7 rows affected (0.02 sec)
Records: 7 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM invoices ORDER BY branch,invoicenumber;
+---------------+--------+------------+--------+
| invoicenumber | branch | date | client |
+---------------+--------+------------+--------+
| 1 | A | 2012-04-21 | John |
| 2 | A | 2012-04-21 | Jeff |
| 3 | A | 2012-04-21 | Jane |
| 4 | A | 2012-04-21 | June |
| 1 | B | 2012-04-21 | Jack |
| 2 | B | 2012-04-21 | Joel |
| 3 | B | 2012-04-21 | Joan |
+---------------+--------+------------+--------+
7 rows in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
试一试 !!!
CAVEAT :目前只有 MyISAM 存储引擎支持多个 auto_increment 值与其他列分组。这对于基于 auto_increment 列直接绑定到gen_clust_index(又名聚集索引)的InnoDB 是不可能的!!!
归档时间: |
|
查看次数: |
15909 次 |
最近记录: |