【问题标题】:Auto_Increment: how to auto_increment a combined-key (ERROR 1075)Auto_Increment:如何自动增加组合键(错误 1075)
【发布时间】:2014-05-21 22:03:02
【问题描述】:

我是 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

我的问题是如何为表格设置组合键,以便每次更改HotelName 时都可以插入RoomNumber

【问题讨论】:

标签: mysql sql


【解决方案1】:

InnoDB 表不支持按照您描述的方式跟踪每个酒店的不同最大值的自动增量。 InnoDB 每个表只跟踪一个自增值。

MyISAM 表确实支持此功能,但这仅适用于 MyISAM 进行表级锁定,因此它能够扫描表以查找相应酒店的最大 id 值。 MyISAM 也不支持回滚,所以不太可能在序列中产生间隙。

尽管如此,I recommend against using MyISAM.

简而言之:您可以创建复合主键,但不能使用自动增量来填充它。您必须在 INSERT 语句中给出特定的整数。

【讨论】:

    【解决方案2】:

    使用在两个表中定义为主键的 auto_increment int 或 big int 字段,将 rooms 表重写为(大)int FK 引用而不是按名称引用。房间号本身(在插入时)不能默认为自动递增,但这并不是一件坏事,因为我看到许多酒店的房间从 112 循环到 200,因为给定建筑物的每一层只有12 间大房间。

    【讨论】:

      【解决方案3】:

      为什么房间号是汽车公司?

      套房呢,房间号有空档的酒店呢?

      我个人会被 room_id auto inc 代理所吸引,但这是另一个问题,通常是一个高度固执己见的问题。

      房间号是自然键,不能自增。

      【讨论】:

        【解决方案4】:

        我尝试像下面的代码一样重写桌室:

        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)
        

        );

        我在写的时候在那个表上添加了一个插入前触发器:

        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。重复条目 '1' for key '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);
        

        【讨论】:

          猜你喜欢
          • 2011-01-25
          • 2021-08-02
          • 2015-03-08
          • 2011-12-28
          • 2016-04-18
          • 2012-12-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多