我正在使用MySQL数据库而我正在尝试执行数据库创建sctipt但是我收到以下错误而没有指出涉及哪一行:
SQL Error (1071): Specified key was too long; max key length is 3072 bytes
这是我的剧本:
/*==============================================================*/
/* Table: MDEV_ADDRESS */
/*==============================================================*/
create table MDEV_ADDRESS
(
id_address bigint not null auto_increment,
street_1 varchar(2500),
street_2 varchar(2500),
zip_code int,
city varchar(255),
region varchar(255),
country varchar(255),
is_delivery_address bool,
primary key (id_address)
);
/*==============================================================*/
/* Table: MDEV_BANK_CARD */
/*==============================================================*/
create table MDEV_BANK_CARD
(
id_bank_card bigint not null auto_increment,
id_user bigint not null,
card_type varchar(150) not null,
card_number int not null,
expiration_date timestamp not null,
security_code int not null,
holder_name varchar(255),
primary key (id_bank_card)
);
/*==============================================================*/
/* Table: MDEV_CATEGORY */
/*==============================================================*/
create table MDEV_CATEGORY
(
id_category bigint not null auto_increment,
id_parent_category bigint,
name varchar(1500) not null,
description varchar(2500),
primary key (id_category)
);
/*==============================================================*/
/* Table: MDEV_CUSTOMER_HAS_ADDRESSES */
/*==============================================================*/
create table MDEV_CUSTOMER_HAS_ADDRESSES
(
id_user bigint not null,
id_address bigint not null,
primary key (id_user, id_address)
);
/*==============================================================*/
/* Table: MDEV_LOGIN_ATTEMPT */
/*==============================================================*/
create table MDEV_LOGIN_ATTEMPT
(
id_login_attempt bigint not null auto_increment,
id_user bigint not null,
attempt_date timestamp not null,
ip_address varchar(150) not null,
has_logged_in bool not null,
log_out_date timestamp,
os varchar(255),
browser varchar(255),
primary key (id_login_attempt)
);
/*==============================================================*/
/* Table: MDEV_NOTIFICATION */
/*==============================================================*/
create table MDEV_NOTIFICATION
(
id_notification bigint not null auto_increment,
id_user bigint not null,
creation_date timestamp not null,
message varchar(2500) not null,
link_url varchar(2500),
is_viewed bool not null,
primary key (id_notification)
);
/*==============================================================*/
/* Table: MDEV_ORDER */
/*==============================================================*/
create table MDEV_ORDER
(
id_order bigint not null auto_increment,
id_user bigint not null,
id_status bigint not null,
reference_number varchar(255) not null unique,
order_date timestamp not null,
payment_date timestamp,
payment_method varchar(255),
primary key (id_order)
);
/*==============================================================*/
/* Table: MDEV_ORDER_LINE */
/*==============================================================*/
create table MDEV_ORDER_LINE
(
id_order_line bigint not null auto_increment,
id_product bigint not null,
id_order bigint not null,
quantity int not null,
primary key (id_order_line)
);
/*==============================================================*/
/* Table: MDEV_PRODUCT */
/*==============================================================*/
create table MDEV_PRODUCT
(
id_product bigint not null auto_increment,
id_category bigint,
reference_number varchar(255) not null unique,
name varchar(1500),
description varchar(2500),
image_path varchar(2500),
price float,
primary key (id_product)
);
/*==============================================================*/
/* Table: MDEV_PRODUCT_HAS_TAGS */
/*==============================================================*/
create table MDEV_PRODUCT_HAS_TAGS
(
id_product bigint not null,
id_tag bigint not null,
primary key (id_product, id_tag)
);
/*==============================================================*/
/* Table: MDEV_ROLE */
/*==============================================================*/
create table MDEV_ROLE
(
id_role bigint not null auto_increment,
name varchar(1500) not null unique,
description varchar(2500),
primary key (id_role)
);
/*==============================================================*/
/* Table: MDEV_SITE_PREFERENCES */
/*==============================================================*/
create table MDEV_SITE_PREFERENCES
(
id_site_preferences bigint not null auto_increment,
name varchar(1500) unique,
root_images_folder_path varchar(2500),
image_max_size int,
image_max_size_unit varchar(2),
image_min_size int,
image_min_size_unit varchar(2),
root_videos_folder_path varchar(2500),
video_max_size int,
video_max_size_unit varchar(2),
video_min_size int,
video_min_size_unit varchar(2),
primary key (id_site_preferences)
);
/*==============================================================*/
/* Table: MDEV_STATUS */
/*==============================================================*/
create table MDEV_STATUS
(
id_status bigint not null auto_increment,
name varchar(1500) not null unique,
primary key (id_status)
);
/*==============================================================*/
/* Table: MDEV_TAG */
/*==============================================================*/
create table MDEV_TAG
(
id_tag bigint not null auto_increment,
name varchar(1500) not null unique,
primary key (id_tag)
);
/*==============================================================*/
/* Table: MDEV_USER */
/*==============================================================*/
create table MDEV_USER
(
id_user bigint not null auto_increment,
id_status bigint not null,
discriminator varchar(50) not null,
u_email varchar(255) not null unique,
u_password varchar(255) not null,
u_username varchar(255) unique,
u_first_name varchar(255) not null,
u_last_name varchar(255) not null,
u_birth_date timestamp,
u_gender varchar(150),
u_registration_date timestamp not null,
u_confirmation_date timestamp,
u_expiration_date timestamp,
u_locking_date timestamp,
u_disabling_date timestamp,
u_credentials_expiration_date timestamp,
u_deletion_date timestamp,
u_locking_reason varchar(5000),
u_disabling_reason varchar(5000),
u_deletion_reason varchar(5000),
u_used_language varchar(150),
u_security_question varchar(255),
u_security_answer varchar(255),
u_code varchar(255) not null unique,
c_phone int,
e_job varchar(255),
e_cnss_number varchar(255),
primary key (id_user)
);
/*==============================================================*/
/* Table: MDEV_USER_HAS_ROLES */
/*==============================================================*/
create table MDEV_USER_HAS_ROLES
(
id_role bigint not null,
id_user bigint not null,
primary key (id_role, id_user)
);
alter table MDEV_BANK_CARD add constraint FK_MDEV_CUSTOMER_HAS_BANK_CARDS foreign key (id_user)
references MDEV_USER (id_user) on delete cascade on update cascade;
alter table MDEV_CATEGORY add constraint FK_MDEV_CATEGORY_HAS_SUB_CATEGORIES foreign key (id_parent_category)
references MDEV_CATEGORY (id_category) on delete cascade on update cascade;
alter table MDEV_CUSTOMER_HAS_ADDRESSES add constraint FK_MDEV_CUSTOMER_HAS_ADDRESSES foreign key (id_user)
references MDEV_USER (id_user) on delete cascade on update cascade;
alter table MDEV_CUSTOMER_HAS_ADDRESSES add constraint FK_MDEV_CUSTOMER_HAS_ADDRESSES2 foreign key (id_address)
references MDEV_ADDRESS (id_address) on delete cascade on update cascade;
alter table MDEV_LOGIN_ATTEMPT add constraint FK_MDEV_USER_HAS_LOGIN_ATTEMPTS foreign key (id_user)
references MDEV_USER (id_user) on delete cascade on update cascade;
alter table MDEV_NOTIFICATION add constraint FK_MDEV_CUSTOMER_HAS_NOTIFICATIONS foreign key (id_user)
references MDEV_USER (id_user) on delete cascade on update cascade;
alter table MDEV_ORDER add constraint FK_MDEV_CUSTOMER_HAS_ORDERS foreign key (id_user)
references MDEV_USER (id_user) on delete cascade on update cascade;
alter table MDEV_ORDER add constraint FK_MDEV_ORDER_HAS_STATUS foreign key (id_status)
references MDEV_STATUS (id_status) on delete cascade on update cascade;
alter table MDEV_ORDER_LINE add constraint FK_MDEV_ORDER_HAS_ORDER_LINES foreign key (id_order)
references MDEV_ORDER (id_order) on delete cascade on update cascade;
alter table MDEV_ORDER_LINE add constraint FK_MDEV_ORDER_LINE_HAS_PRODUCT foreign key (id_product)
references MDEV_PRODUCT (id_product) on delete cascade on update cascade;
alter table MDEV_PRODUCT add constraint FK_MDEV_CATEGORY_HAS_PRODUCTS foreign key (id_category)
references MDEV_CATEGORY (id_category) on delete cascade on update cascade;
alter table MDEV_PRODUCT_HAS_TAGS add constraint FK_MDEV_PRODUCT_HAS_TAGS foreign key (id_product)
references MDEV_PRODUCT (id_product) on delete cascade on update cascade;
alter table MDEV_PRODUCT_HAS_TAGS add constraint FK_MDEV_PRODUCT_HAS_TAGS2 foreign key (id_tag)
references MDEV_TAG (id_tag) on delete cascade on update cascade;
alter table MDEV_USER add constraint FK_MDEV_USER_HAS_STATUS foreign key (id_status)
references MDEV_STATUS (id_status) on delete cascade on update cascade;
alter table MDEV_USER_HAS_ROLES add constraint FK_MDEV_USER_HAS_ROLES foreign key (id_role)
references MDEV_ROLE (id_role) on delete cascade on update cascade;
alter table MDEV_USER_HAS_ROLES add constraint FK_MDEV_USER_HAS_ROLES2 foreign key (id_user)
references MDEV_USER (id_user) on delete cascade on update cascade;
我正在使用HeidiSQL执行此脚本,显然执行会在到达表创建时抛出错误:
/*==============================================================*/
/* Table: MDEV_ROLE */
/*==============================================================*/
create table MDEV_ROLE
(
id_role bigint not null auto_increment,
name varchar(1500) not null unique,
description varchar(2500),
primary key (id_role)
);
据我所知,我创建的唯一索引是主键,它们只有8个字节长。
如果有人可以帮助我,那会很棒吗? 提前谢谢。
答案 0 :(得分:1)
你没有提到MySQL的版本。我假设你正在使用InnoDB和MySQL 5.7。
您可以找到以下代码段:
对于InnoDB表,索引键前缀长度限制为767字节 使用REDUNDANT或COMPACT行格式。例如,你可能会命中 此限制,列前缀索引超过255个字符 TEXT或VARCHAR列,假设一个utf8mb3字符集和 每个字符最多3个字节。
之所以会发生这种情况,是因为您拥有唯一的名称,该名称将创建一个受上述约束限制的索引。
更多信息:https://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html
答案 1 :(得分:1)
name varchar(1500) not null unique,
varchar上的唯一键太长了。
由于您有多字节字符,因此此处需要更多字节。
答案 2 :(得分:1)
将您在创建表格时使用的唯一键的长度减少到767或766,它会很好用