我是mySQL开发的新手,我试图设置一个简单的酒店预订数据库。数据库的一部分是下表列表:
关系是:一个酒店包含许多房间,但一个房间属于一个特定的酒店(一对多的关系)。所以我设计了这样的表:
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)
);
Rooms
表包含表格主键与HotelName
和RoomNumber
相结合的会议室。此时,我希望每次插入一个新的HotelName
,auto_increment (
RoomNumber`)都要重置,即:
Hotel RoomNumber
------ ----------
HotelA 1
HotelA 2
HotelA 3
HotelB 1
HotelB 2
HotelC 1
所以我设计了这样的表Rooms
:
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
我的问题是如何将组合键设置为表格,以便每次更改RoomNumber
时都可以插入HotelName
?
答案 0 :(得分:0)
使用auto_increment int或在两个表中定义为主键的big int字段,将rooms表重写为(大)int FK引用而不是名称。房间号码(插入时)不能默认为自动递增,但这并不是坏事,因为我看过很多酒店的房间从112到200不等,因为给定建筑物中的每个楼层都只是12间客房。
答案 1 :(得分:0)
InnoDB表不支持以您描述的方式跟踪每个酒店的不同最大值的自动增量。 InnoDB每个表只跟踪一个自动增量值。
MyISAM表确实支持此功能,但这仅适用,因为MyISAM执行表级锁定,因此它能够扫描表中相应酒店的最大id值。此外,MyISAM不支持回滚,因此在序列中产生间隙的可能性稍小。
但尽管如此,I recommend against using MyISAM。
简而言之:您可以创建复合主键,但不能使用自动增量来填充它。您必须在INSERT语句中给出特定的整数。
答案 2 :(得分:0)
为什么房间号码是自动公司?
套房怎么样,房间号码有差距的酒店怎么样?
我个人会被一个room_id汽车公司代理人诱惑,但那是另一个问题,而且一般来说是一个高度自以为是的问题。
房间号是一个自然键,它不应该自动递增。
答案 3 :(得分:0)
我试着像下面的代码那样重写桌面房间:
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;
但是,当我尝试按照下面插入的方式插入值时,增量序列不起作用,我得到了#34;错误代码:1062。重复输入' 1'关键' PRIMARY' "我认为这是正确的。
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);