【问题标题】:varchar and auto increment togettervarchar 和 auto increment togetter
【发布时间】:2013-12-01 00:32:24
【问题描述】:

我正在研究我自己的数据库,在休息日只通过研究和谷歌的东西尽可能多地学习! 我正在做一张简单的桌子,但是几乎没有疑问。 我真的很感激任何帮助!

我确实尝试使用VARCHAR 而不是INT 从表单中获取reservation_code,但我不能在其上使用AUTO_INCREMET。我得到错误!预订代码应如下所示:123AB。我该怎么办?

CREATE TABLE flight
   (
    reservation_code VARCHAR(5) NOT NULL AUTO_INCREMENT,
    flying_from VARCHAR(20) NOT NULL,
    flying_to VARCHAR(20) NOT NULL,
    PRIMARY KEY (reservation_code) 
    );



CREATE TABLE passenger
   (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    last_name VARCHAR(20) NOT NULL,
    sex VARCHAR(1) NOT NULL,
    PRIMARY KEY (id),
    FOREING KEY (reservation_code) REFERENCES flight(reservation_code), 
    FOREING KEY (flight_date) REFERENCES flight_detail(flight_date),
    FOREING KEY (bank_card) REFERENCES passenger_details(bank_card) 
    );

CREATE TABLE passenger_details
   (
   bank_card INT NOT NULL AUTO_INCREMENT,
   email VARCHAR(20) NOT NULL,
   mobile INT NOT NULL,
   PRIMARY KEY (bank_card) 
   );

CREATE TABLE flight_detail
   (
   flight_date DATE NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (flight_date)       
   );

【问题讨论】:

  • 首先请指出(在标签中)你正在使用什么数据库(在我看来像 MySQL)。第二 - 你如何想象 varchar 的自动增量?逻辑是什么?
  • 当然,它的mysql!因此,在 html 表单上,有一个字段文本(预订代码),用户将在其中输入!这个预订代码是从另一个系统(另一个公司)生成的,这个代码会一直增加!例如:001AB 然后 002AB, 003AB 直到可能性结束!
  • 如果代码是在另一家公司的另一个系统上生成的,为什么需要增加它?它是由另一家公司生成的;你应该只是存储它

标签: mysql sql


【解决方案1】:

您不能使用 AUTO_INCREMENT 来解决这类问题。相反,您可以使用触发器。不管怎样,你的任务已经有了解决方案How to make MySQL table primary key auto increment with some prefix

更新: 关于解决您的外键问题。 起初,您的上述代码中有不正确的语法FOREING 必须是FOREIGN。 要创建外键本身,您需要在子表中创建适当的列和索引,正如我在您的评论中看到的那样,您只需使用 FOREIGN 语句而不创建相应的结构。仅此语句不会在您的表中创建必要的结构,因此您需要在创建外键之前自己显式创建该结构。例如,要在 passengerflight 之间创建关系,您需要调用:

CREATE TABLE flight(
   reservation_code VARCHAR(10),
   PRIMARY KEY (reservation_code)
);

CREATE TABLE passenger (
   id INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(20) NOT NULL,
   last_name VARCHAR(20) NOT NULL,
   sex VARCHAR(1) NOT NULL,
   reservation_code VARCHAR(10),

   PRIMARY KEY (id),
   INDEX (reservation_code),
   FOREIGN KEY (reservation_code)
   REFERENCES flight(reservation_code)
 );

在此处查看实际操作http://sqlfiddle.com/#!2/34ead

另外请阅读有关 MySQL 中外键的更多信息here

【讨论】:

  • 完美,但是当 000AB 变成 999 时,字符也必须改变!比如:999AB、999AC、999AD!实际上,当字符 ABCDE.. 结束时,我不知道该怎么做才能使序列 999 变得随意!
  • 那么,那你需要看看这个问题stackoverflow.com/questions/6526008/…。它会给你一些指导。
  • 其实我还是卡在做de Fk! CREATE TABLE 乘客 ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(20) NOT NULL, last_name VARCHAR(20) NOT NULL, sex VARCHAR(1) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (reservation_code) REFERENCES flight(reservation_code) , FOREIGN KEY (flight_day) REFERENCES flight_detail(flight_day), FOREIGN KEY (bank_card) REFERENCES Passenger_details(bank_card) );错误 1072 (42000):表中不存在键列“reservation_code”。如果列在那里怎么可能?
  • 这就是我今天早上才意识到的!我做了这样的事情:创建表乘客详细信息(bank_card INT(20)NOT NULL AUTO_INCREMENT,电子邮件VARCHAR(20),移动INT(15)NOT NULL,passenger_id INT NOT NULL,主键(bank_card),外键(passenger_id)参考乘客(p_id));
【解决方案2】:

创建一个表来存储您的自定义序列,类型为 Char 或 varchar。通过使用线程锁定,确保在您的代码中一次只有一个客户端可以获取下一个序列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    相关资源
    最近更新 更多