Mysql 自动递增:如何自动递增组合键(错误1075)
我是mySQL开发新手,我正在尝试设置一个简单的酒店预订数据库。数据库的一部分是下表列表:Mysql 自动递增:如何自动递增组合键(错误1075),mysql,sql,Mysql,Sql,我是mySQL开发新手,我正在尝试设置一个简单的酒店预订数据库。数据库的一部分是下表列表: 旅馆 房间 这种关系是:一个酒店包含多个房间,但一个房间属于一个特定的酒店(一对多关系)。所以我把桌子设计成这样: CREATE TABLE Hotels ( HotelName CHAR(50) NOT NULL UNIQUE, HotelEmail CHAR(200) NOT NULL, Category CHAR(1) NOT NULL, Street CHAR(
- 旅馆
- 房间
CREATE TABLE Hotels (
HotelName CHAR(50) NOT NULL UNIQUE,
HotelEmail CHAR(200) NOT NULL,
Category CHAR(1) NOT NULL,
Street CHAR(200),
StreetNumber CHAR(5),
PostalCodhotelse CHAR(10),
City CHAR(20),
Country CHAR(30),
Phone CHAR(10),
PRIMARY KEY (HotelName)
);
CREATE TABLE Rooms (
HotelName CHAR(200) NOT NULL,
RoomNumber int auto_increment,
RoomType CHAR(30),
NumOfBeds INT Unsigned,
Description TEXT,
PRIMARY KEY (HotelName, RoomNumber),
FOREIGN KEY (HotelName)
References hotels (HotelName)
ON UPDATE cascade
);
Rooms
表包含表主键与HotelName
和RoomNumber
组合的房间。此时,我希望每次插入新的HotelName
,都会重置自动增量(
RoomNumber`),即:
Hotel RoomNumber
------ ----------
HotelA 1
HotelA 2
HotelA 3
HotelB 1
HotelB 2
HotelC 1
所以我把桌子房间设计成这样:
CREATE TABLE Hotels (
HotelName CHAR(50) NOT NULL UNIQUE,
HotelEmail CHAR(200) NOT NULL,
Category CHAR(1) NOT NULL,
Street CHAR(200),
StreetNumber CHAR(5),
PostalCodhotelse CHAR(10),
City CHAR(20),
Country CHAR(30),
Phone CHAR(10),
PRIMARY KEY (HotelName)
);
CREATE TABLE Rooms (
HotelName CHAR(200) NOT NULL,
RoomNumber int auto_increment,
RoomType CHAR(30),
NumOfBeds INT Unsigned,
Description TEXT,
PRIMARY KEY (HotelName, RoomNumber),
FOREIGN KEY (HotelName)
References hotels (HotelName)
ON UPDATE cascade
);
但是,当我尝试执行最后一条SQL语句来创建表时,我得到以下消息:
Error Code: 1075. Incorrect table definition; there can be only one auto column and it must be defined as a key
我的问题是如何设置表的组合键,以便在每次更改HotelName
时插入RoomNumber
?使用两个表中定义为主键的自动增量int或大int字段,将rooms表重写为(大)int FK引用,而不是按名称。房间号本身(插入时)不能默认为自动递增,但这不是一件坏事,因为我看到许多酒店的房间从112间循环到200间,因为给定建筑中的每层楼只有12间房间大。InnoDB表不支持跟踪每个酒店不同最大值的自动递增,按照你描述的方式。InnoDB只跟踪每个表的一个自动增量值
MyISAM表确实支持此功能,但这只是因为MyISAM执行表级锁定,所以它能够扫描表以查找相应酒店的最大id值。此外,MyISAM不支持回滚,因此它不太可能在序列中产生间隙
但尽管如此
简而言之:您可以创建复合主键,但不能使用自动增量填充它。您必须在INSERT语句中给出特定的整数。为什么房间号是自动公司的
套房呢,房间数有差距的酒店呢
我个人可能会被room_id auto inc的代理吸引,但这是另一个问题,通常是一个非常固执己见的问题
房间号是一个自然键,不应该是自动递增的。我尝试重新编写表格房间,如下代码所示:
CREATE TABLE Rooms (
HotelName CHAR(200) NOT NULL,
RoomNumber int NOT NULL,
RoomType CHAR(30),
NumOfBeds INT Unsigned,
Description TEXT,
PRIMARY KEY (RoomNumber),
UNIQUE KEY (HotelName, RoomNumber)
))
当我写下时,我在该表上添加了一个before insert触发器:
CREATE TRIGGER room_number BEFORE INSERT ON rooms
FOR EACH ROW
begin
set new.RoomNumber = (select ifnull((select max(RoomNumber)+1 from rooms where HotelEmail = new.HotelEmail), 1)); end;
但是,当我尝试按照下面插入值的方式插入值时,增量序列不起作用,我得到了“错误代码:1062。键“PRIMARY”的重复条目“1”,我认为这是正确的
INSERT INTO rooms (HotelName, RoomType, NumOfBeds, Description) VALUES ('HotelA', 'Executive', 3, NULL);
INSERT INTO rooms (HotelName, RoomType, NumOfBeds, Description) VALUES ('HotelA', 'Deluxe', 4, NULL);
INSERT INTO rooms (HotelName, RoomType, NumOfBeds, Description) VALUES ('HotelB', 'Economy', 2, NULL);
INSERT INTO rooms (HotelName, RoomType, NumOfBeds, Description) VALUES ('HotelB', 'Deluxe', 4, NULL);
使用Roomnumber主键并在(hotelname,Roomnumber)上使用唯一键您的存储引擎必须是MyISAM,请检查