Mysql 自动递增:如何自动递增组合键(错误1075)

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(

我是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)
);
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,请检查