【问题标题】:How to set AUTO_INCREMENT default value and rate of increase in MySQL 5.6如何在 MySQL 5.6 中设置 AUTO_INCREMENT 默认值和增长率
【发布时间】:2015-09-27 04:29:35
【问题描述】:

我希望“ProjectID”从 1000 开始并以 100 递增。

如何在 MySQL 5.6 中设置 AUTO_INCREMENT 默认值和速率?换句话说,如果我想创建一个从 1000 开始并增加 100 的主键,我该如何在 MySQL 中做到这一点?

CREATE TABLE IF NOT EXISTS PROJECT(  
ProjectID Int(4) AUTO_INCREMENT PRIMARY KEY,  
ProjectName Char(20) NOT NULL,  
DepartmentName Char(30) NOT NULL,  
MaxHours Int(14) NOT NULL,  
StartDate Char(10) NOT NULL,  
EndDate Char(10) NULL)  
ENGINE=InnoDB AUTO_INCREMENT=1000;

我希望“ProjectID”从 1000 开始并以 100 递增。

【问题讨论】:

  • 您正试图创造差距,因为您喜欢这个概念,但太新而无法欣赏它的简单性......并且想稍后插入数据?
  • @DrewPierce 其实我不认为我必须输入数据。我认为使用现代英语而不是 SQL 可能会刺激神经元。
  • 谷歌和 mysql 手册万岁:dev.mysql.com/doc/refman/5.0/en/…
  • @NorbertvanNobelen 抱歉,我使用的是 MySQL 5.6。 AUTO_INCREMENT_INCREMENT 在 5.6 中不是有效命令。我将再次更新问题。

标签: mysql default auto-increment


【解决方案1】:

从空表开始。

ALTER TABLE tblName AUTO_INCREMENT = 1000;

在一处且仅一处执行插入到这个特殊的 100 间隙表。

我们称那个地方为存储过程(不是强制性的)。

遵守该方法的纪律。

在该存储过程中锁定表,执行插入操作。

DECLARE 将查询作为“字符串”,然后通过Prepared Statement 执行该字符串。该字符串与上面的 Alter Table 类似,但具有 auto_increment=xxxx

其中 xxxx=max(ProjectID)+100

解锁表。退出存储过程。

原因是Alter Table tblName auto_increment = variable_name 会出错。所以它需要是一个被执行的Prepared Statement

按承诺编辑:

drop schema wpc;
CREATE SCHEMA IF NOT EXISTS WPC;

use wpc;

CREATE TABLE IF NOT EXISTS department 
( 
    Department varchar(30) NOT NULL,    -- chg 
    BudgetCode int(20) NOT NULL, 
    OfficeNumber int(10) NOT NULL, 
    Phone varchar(12) DEFAULT NULL, -- chg 
    PRIMARY KEY (Department) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS employee 
( 
    EmployeeNumber int(4) AUTO_INCREMENT, 
    FirstName varchar(25) NOT NULL, -- chg
    LastName varchar(25) NOT NULL, -- chg
    Department varchar(30) NOT NULL DEFAULT 'Human Resources', 
    Phone varchar(17) DEFAULT NULL, -- chg 
    Email varchar(100) NOT NULL, 

    PRIMARY KEY (EmployeeNumber), 
    UNIQUE KEY Email (Email), 
    KEY DepartmentFK (Department), 

    CONSTRAINT DepartmentFK 
    FOREIGN KEY (Department) 
    REFERENCES department (Department) ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS project 
( 
    ProjectID INT(4) NOT NULL AUTO_INCREMENT, 
    ProjectName VARCHAR(30) NOT NULL, -- chg
    Department VARCHAR(30) NOT NULL,  -- chg
    MaxHours INT(3) NOT NULL DEFAULT '100', 
    StartDate datetime NOT NULL, -- chg
    EndDate datetime DEFAULT NULL, -- chg

    PRIMARY KEY (ProjectID), 
    KEY ProjectFK (Department), 

    CONSTRAINT ProjectFK 
    FOREIGN KEY (Department) 
    REFERENCES department (Department) ON UPDATE CASCADE
) ENGINE=INNODB DEFAULT CHARSET=LATIN1 AUTO_INCREMENT=1000;

CREATE TABLE IF NOT EXISTS assignment 
( 
    ProjectID INT(4) NOT NULL AUTO_INCREMENT, 
    EmployeeNumber INT(4) NOT NULL, 
    HoursWorked INT(4) NOT NULL, 

    PRIMARY KEY (ProjectID), 
    -- UNIQUE KEY EmployeeNumber (EmployeeNumber), -- kill this dupe, plus it won't be unique 
    -- KEY ProjectFK1 (ProjectID), -- don't have this it is already a PK
    KEY EmployeeFK1 (EmployeeNumber), -- keep this as it won't be unique
    -- duplicate and unnecessary keys just slow down system. you had 4. you need 2

    CONSTRAINT EmployeeFK1 
    FOREIGN KEY (EmployeeNumber) 
    REFERENCES employee (EmployeeNumber), 

    CONSTRAINT ProjectFK1 
    FOREIGN KEY (ProjectID) 
    REFERENCES project (ProjectID) ON DELETE CASCADE 
) ENGINE=INNODB DEFAULT CHARSET=LATIN1;

show table status like '%'; -- auto_incs look good

insert project (ProjectName,Department,MaxHours,StartDate,EndDate) values ('Dismantle Kryptonite','Engineering',1000,'2015-04-01',null);
-- fk error, good, do dept first. BUT NOTE this failure screws up auto_inc so next insert is 1001 yikes
-- so re-do, drop schema, create schema, skip failed first insert above and start below:
insert department (Department,BudgetCode,OfficeNumber,Phone) values ('Engineering',111,222,null);
insert department (Department,BudgetCode,OfficeNumber,Phone) values ('Human Resources',107,223,null);
select * from department;
-- all looks well
insert project (ProjectName,Department,MaxHours,StartDate,EndDate) values ('Dismantle Kryptonite','Engineering',1000,'2015-04-01',null);
select * from project; -- projectId 1000
alter table project auto_increment=1010;
insert project (ProjectName,Department,MaxHours,StartDate,EndDate) values ('Fire old employees','Human Resources',2,'2015-04-02',null);
alter table project auto_increment=1020;
insert project (ProjectName,Department,MaxHours,StartDate,EndDate) values ('Regret, Hire back','Human Resources',2,'2015-04-02',null);
alter table project auto_increment=1030;

select * from project;

fk's look good and as expected. Try employee:

insert employee (EmployeeNumber,FirstName,LastName,Department,Phone,Email) values (222,'Donald','','bad-dept','1','d@g.com'); 
insert employee (EmployeeNumber,FirstName,LastName,Department,Phone,Email) values (222,'Donald','','Engineering','1','d@g.com'); 
insert employee (EmployeeNumber,FirstName,LastName,Phone,Email) values (223,'Kris','','2','k@g.com'); 
insert employee (EmployeeNumber,FirstName,LastName,Phone,Email) values (2277,'Kim','','3','kim@g.com'); 
select * from employee;
insert employee (FirstName,LastName,Phone,Email) values ('Auto','','44','auto1@g.com'); -- 2278
do a re-do of everything top to bottom but skipping employee inserts except the below to run:

insert employee (FirstName,LastName,Department,Phone,Email) values ('Donald','','Engineering','1','d@g.com'); 
insert employee (FirstName,LastName,Phone,Email) values ('Kris','','2','k@g.com'); 
insert employee (FirstName,LastName,Phone,Email) values ('Kim','','3','kim@g.com'); 
select * from employee;
insert project (ProjectName,Department,MaxHours,StartDate,EndDate) values ('Hire Joe','Human Resources',2,'2015-05-02',null);
alter table project auto_increment=1040;
insert employee (FirstName,LastName,Phone,Email) values ('Jason','','66','jj@g.com'); 
select * from employee;
select * from project;

【讨论】:

  • @@auto_increment_increment 设置整个架构的增量值。我不能这样做,因为另一个表必须递增 1。其中一些内容超出了我的想象,因为我没有使用存储过程的经验。我创建了一个新问题,并在stackoverflow.com/questions/31362069/… 提供了完整的数据
  • 正如我所描述的,auto_increment 是在表级别,并且我会这样做的唯一方法。问问周围。一样的答案
  • Auto_inc 在表级别,如我的答案的第 2 行所示,假设您设置为 2700 意味着下一个仅为该表的 2700。如果你没有在下一个之前重置它,下一个是 2701,然后是 2702。玩它,因为它在最多 3 分钟内变得明显
  • 我只知道我刚刚开始学习触发器和存储过程。我知道一点 C++,所以我熟悉“字符串”。这被认为是 SQL 中的数据类型吗?我知道如何创建触发器,但除了知道“存储过程”这个术语外,我知之甚少。
  • 让我开始完成向您展示我在谈论您的架构的内容。需要 30 分钟吗?
【解决方案2】:

创建表:

CREATE TABLE IF NOT EXISTS PROJECT( ProjectID Int(4) AUTO_INCREMENT PRIMARY KEY, ProjectName Char(20) NOT NULL, DepartmentName Char(30) NOT NULL, MaxHours Int(14) NOT NULL, StartDate Char(10) NOT NULL, EndDate Char(10) NULL) ENGINE=InnoDB AUTO_INCREMENT=1000;

然后输入:

SET @@AUTO_INCREMENT_INCREMENT=100;

现在 ProjectID 是一个代理键,从 1000 开始并增加 100。

https://dev.mysql.com/doc/refman/5.0/en/replication-options-master.html#sysvar_auto_increment_offset

谢谢@NorbertvanNobelen!

【讨论】:

猜你喜欢
  • 2014-03-21
  • 2014-05-29
  • 2011-07-07
  • 2020-03-08
  • 2012-06-20
  • 1970-01-01
  • 2019-04-14
  • 2014-07-16
  • 2013-08-10
相关资源
最近更新 更多