Auto_Increment:如何auto_increment组合键(ERROR 1075)

时间:2014-05-21 22:03:03

标签: mysql sql

我是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表包含表格主键与HotelNameRoomNumber相结合的会议室。此时,我希望每次插入一个新的HotelNameauto_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

4 个答案:

答案 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);