MySQL 5.6中如何设置AUTO_INCREMENT默认值和增长率

How to set AUTO_INCREMENT default value and rate of increase in MySQL 5.6

我希望 '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。

从空开始 table。

ALTER TABLE tblName AUTO_INCREMENT = 1000;

在一个而且只有一个地方执行插入到这个特殊的 100 间隙 table。

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

遵守该方法的纪律。

在该存储过程中锁定 table,执行插入。

DECLARE 作为 "string" 的查询,然后通过 Prepared Statement 执行该字符串。该字符串类似于上面的 Alter Table 但带有 auto_increment=xxxx

其中 xxxx=max(项目 ID)+100

解锁table。退出存储过程。

原因是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;

创建 table:

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!