CREATE TABLE IF NOT EXISTS T_ACCOUNT(
ACC_ID INT(6) NOT NULL AUTO_INCREMENT COMMENT '帐号ID',
ACC_NAME varchar(255) NOT NULL COMMENT '帐号名',
ACC_PASSWORD VARCHAR(255) NOT NULL COMMENT '帐号密码',
ACC_EMPIRETIME datetime default NULL COMMENT '失效时间',
USER_ID INT(6) NOT NULL COMMENT '关联用户ID',
REMARK varchar(100) COMMENT '口令备注',
MODIFY_COUNT int(4) NOT NULL default '0' COMMENT '修改次数',
CREATED_DATE datetime NOT NULL COMMENT '创建日期',
CREATED_BY varchar(20) NOT NULL COMMENT '创建人',
CREATED_PRG_NAME varchar(20) NOT NULL COMMENT '创建的子项目名',
LAST_MODIFY_DATE datetime default NULL COMMENT '最后修改时间',
UPDATED_PRG_NAME varchar(20) default NULL COMMENT '最后修改的子项目名',
UPDATED_BY varchar(20) default NULL COMMENT '最后修改人',
FLG_COUNT int(4) default '0' COMMENT '修改次数标签',
PRIMARY KEY (ACC_ID),
UNIQUE KEY UN_ACC_NAME (ACC_NAME ),
UNIQUE KEY UN_USER_ID (USER_ID ), //有它就不能创建外键,理由是???
CONSTRAINT FK_USER_ID FOREIGN KEY (USER_ID) REFERENCES T_USER(USER_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;最后采用ALTER实现了要求。ALTER TABLE T_ACCOUNT ADD INDEX FK_ACC_USER_ID (USER_ID), ADD CONSTRAINT FK_ACC_USER_ID FOREIGN KEY(USER_ID) REFERENCES T_USER (USER_ID);大家给个理由,平时还真没注意这个问题。
ACC_ID INT(6) NOT NULL AUTO_INCREMENT COMMENT '帐号ID',
ACC_NAME varchar(255) NOT NULL COMMENT '帐号名',
ACC_PASSWORD VARCHAR(255) NOT NULL COMMENT '帐号密码',
ACC_EMPIRETIME datetime default NULL COMMENT '失效时间',
USER_ID INT(6) NOT NULL COMMENT '关联用户ID',
REMARK varchar(100) COMMENT '口令备注',
MODIFY_COUNT int(4) NOT NULL default '0' COMMENT '修改次数',
CREATED_DATE datetime NOT NULL COMMENT '创建日期',
CREATED_BY varchar(20) NOT NULL COMMENT '创建人',
CREATED_PRG_NAME varchar(20) NOT NULL COMMENT '创建的子项目名',
LAST_MODIFY_DATE datetime default NULL COMMENT '最后修改时间',
UPDATED_PRG_NAME varchar(20) default NULL COMMENT '最后修改的子项目名',
UPDATED_BY varchar(20) default NULL COMMENT '最后修改人',
FLG_COUNT int(4) default '0' COMMENT '修改次数标签',
PRIMARY KEY (ACC_ID),
UNIQUE KEY UN_ACC_NAME (ACC_NAME ),
UNIQUE KEY UN_USER_ID (USER_ID ), //有它就不能创建外键,理由是???
CONSTRAINT FK_USER_ID FOREIGN KEY (USER_ID) REFERENCES T_USER(USER_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;最后采用ALTER实现了要求。ALTER TABLE T_ACCOUNT ADD INDEX FK_ACC_USER_ID (USER_ID), ADD CONSTRAINT FK_ACC_USER_ID FOREIGN KEY(USER_ID) REFERENCES T_USER (USER_ID);大家给个理由,平时还真没注意这个问题。
解决方案 »
- 数据库多条件查询
- [mysql]一个多表update遇到的问题,新手急求,在线等
- 向左左提问:MYSQL参数设定
- MySQL数据库管理软件连接问题
- 捕获 The SELECT would examine more than MAX_JOIN_SIZE rows; 错误
- 如何批量删除MySQL中的表。
- 谁有linux下c操作mysql的demo??
- MYSQL的全文检索好象对中文支持的不怎么样
- 请问MY SQL可以像ms sql那样导入*.SQL文件吗??
- 求助如何统计timestamp每十分钟的数据
- AUTO_INCREMENT 是不是必须设成主键
- 多个条件的查询建立索引是几个字段建立一个索引还是还每个字段定义为一个索引?
* 使用在外键关系的域必须为索引型(Index)。
* 使用在外键关系的域必须与数据类型相似。
CREATE TABLE person (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name CHAR(60) NOT NULL,
PRIMARY KEY (id)
)type=innoDB;CREATE TABLE shirt (
id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
owner SMALLINT UNSIGNED NOT NULL,
FOREIGN KEY (owner) REFERENCES PERSON(id)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY (id)
)type=innoDB; 这样可以
* 两个表必须是InnoDB表类型。 完全相同
* 使用在外键关系的域必须与数据类型相似。 都是INT(6)
* 使用在外键关系的域必须为索引型(Index)。 还真不明白。我没有创建索引一样可以创建外键,因为有默认外键就会有索引。
加了UNIQUE约束就不是索引了么?
CREATE TABLE IF NOT EXISTS T_ACCOUNT(
ACC_ID INT(6) NOT NULL AUTO_INCREMENT COMMENT '帐号ID',
ACC_NAME varchar(255) NOT NULL COMMENT '帐号名',
ACC_PASSWORD VARCHAR(255) NOT NULL COMMENT '帐号密码',
ACC_EMPIRETIME datetime default NULL COMMENT '失效时间',
USER_ID INT(6) NOT NULL COMMENT '关联用户ID',
REMARK varchar(100) COMMENT '口令备注',
MODIFY_COUNT int(4) NOT NULL default '0' COMMENT '修改次数',
CREATED_DATE datetime NOT NULL COMMENT '创建日期',
CREATED_BY varchar(20) NOT NULL COMMENT '创建人',
CREATED_PRG_NAME varchar(20) NOT NULL COMMENT '创建的子项目名',
LAST_MODIFY_DATE datetime default NULL COMMENT '最后修改时间',
UPDATED_PRG_NAME varchar(20) default NULL COMMENT '最后修改的子项目名',
UPDATED_BY varchar(20) default NULL COMMENT '最后修改人',
FLG_COUNT int(4) default '0' COMMENT '修改次数标签',
PRIMARY KEY (ACC_ID),
UNIQUE KEY UN_ACC_NAME (ACC_NAME ),
CONSTRAINT FK_USER_ID FOREIGN KEY (USER_ID) REFERENCES T_USER(USER_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 如上可以创建外键。
T_USER
建表SQL?
假设A,ID 主键。
B,AID外键。
那么
1、A 和B必须都是INNODB引擎。
2、ID 和AID 类型、长度必须一致。
3、AID 必须是KEY.
4、foreign key 的名字必须在整个库是唯一的。
现在的主要问题是即是外键又有唯一约束直接创建可否行的通。desc 后KEY --uni类型!!
create table t_user(USER_ID int primary key) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS T_ACCOUNT(
ACC_ID INT(6) NOT NULL AUTO_INCREMENT COMMENT '帐号ID',
ACC_NAME varchar(255) NOT NULL COMMENT '帐号名',
ACC_PASSWORD VARCHAR(255) NOT NULL COMMENT '帐号密码',
ACC_EMPIRETIME datetime default NULL COMMENT '失效时间',
USER_ID INT(6) NOT NULL COMMENT '关联用户ID',
REMARK varchar(100) COMMENT '口令备注',
MODIFY_COUNT int(4) NOT NULL default '0' COMMENT '修改次数',
CREATED_DATE datetime NOT NULL COMMENT '创建日期',
CREATED_BY varchar(20) NOT NULL COMMENT '创建人',
CREATED_PRG_NAME varchar(20) NOT NULL COMMENT '创建的子项目名',
LAST_MODIFY_DATE datetime default NULL COMMENT '最后修改时间',
UPDATED_PRG_NAME varchar(20) default NULL COMMENT '最后修改的子项目名',
UPDATED_BY varchar(20) default NULL COMMENT '最后修改人',
FLG_COUNT int(4) default '0' COMMENT '修改次数标签',
PRIMARY KEY (ACC_ID),
UNIQUE KEY UN_ACC_NAME (ACC_NAME ),
CONSTRAINT FK_USER_ID FOREIGN KEY (USER_ID) REFERENCES T_USER(USER_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
drop table if exists t_user;
create table t_user(USER_ID int primary key) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS T_ACCOUNT(
ACC_ID INT(6) NOT NULL AUTO_INCREMENT COMMENT '帐号ID',
ACC_NAME varchar(255) NOT NULL COMMENT '帐号名',
ACC_PASSWORD VARCHAR(255) NOT NULL COMMENT '帐号密码',
ACC_EMPIRETIME datetime default NULL COMMENT '失效时间',
USER_ID INT(6) NOT NULL COMMENT '关联用户ID',
REMARK varchar(100) COMMENT '口令备注',
MODIFY_COUNT int(4) NOT NULL default '0' COMMENT '修改次数',
CREATED_DATE datetime NOT NULL COMMENT '创建日期',
CREATED_BY varchar(20) NOT NULL COMMENT '创建人',
CREATED_PRG_NAME varchar(20) NOT NULL COMMENT '创建的子项目名',
LAST_MODIFY_DATE datetime default NULL COMMENT '最后修改时间',
UPDATED_PRG_NAME varchar(20) default NULL COMMENT '最后修改的子项目名',
UPDATED_BY varchar(20) default NULL COMMENT '最后修改人',
FLG_COUNT int(4) default '0' COMMENT '修改次数标签',
PRIMARY KEY (ACC_ID),
UNIQUE KEY UN_ACC_NAME (ACC_NAME ),
CONSTRAINT FK_USER_ID FOREIGN KEY (USER_ID) REFERENCES T_USER(USER_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
需要的结果是:但是DESC T_ACCOUNT; USER_IDKETUNI
T_USER中的USER_ID是唯一的?
drop table if exists t_user;
create table t_user(USER_ID int primary key) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS T_ACCOUNT(
ACC_ID INT(6) NOT NULL AUTO_INCREMENT COMMENT '帐号ID',
ACC_NAME varchar(255) NOT NULL COMMENT '帐号名',
ACC_PASSWORD VARCHAR(255) NOT NULL COMMENT '帐号密码',
ACC_EMPIRETIME datetime default NULL COMMENT '失效时间',
USER_ID INT(6) NOT NULL COMMENT '关联用户ID',
REMARK varchar(100) COMMENT '口令备注',
MODIFY_COUNT int(4) NOT NULL default '0' COMMENT '修改次数',
CREATED_DATE datetime NOT NULL COMMENT '创建日期',
CREATED_BY varchar(20) NOT NULL COMMENT '创建人',
CREATED_PRG_NAME varchar(20) NOT NULL COMMENT '创建的子项目名',
LAST_MODIFY_DATE datetime default NULL COMMENT '最后修改时间',
UPDATED_PRG_NAME varchar(20) default NULL COMMENT '最后修改的子项目名',
UPDATED_BY varchar(20) default NULL COMMENT '最后修改人',
FLG_COUNT int(4) default '0' COMMENT '修改次数标签',
PRIMARY KEY (ACC_ID),
UNIQUE KEY UN_ACC_NAME (ACC_NAME ),
UNIQUE KEY UN_USER_ID (USER_ID ),
CONSTRAINT FK_USER_ID FOREIGN KEY (USER_ID) REFERENCES T_USER(USER_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 这样也可以,在MYSQL 5.1。17下测试通过
我开始也这么写的,但是用sqlyou查看INDEXS时就有三个索引列1:ACC_ID PRI
2:UN_ACC_NAME
3:UN_USER_ID 反倒没有FK_USER_ID 你用什么方式查看的?
+------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+----------------+
| ACC_ID | int(6) | NO | PRI | NULL | auto_increment |
| ACC_NAME | varchar(255) | NO | UNI | | |
| ACC_PASSWORD | varchar(255) | NO | | | |
| ACC_EMPIRETIME | datetime | YES | | NULL | |
| USER_ID | int(6) | NO | UNI | | |
| REMARK | varchar(100) | YES | | NULL | |
| MODIFY_COUNT | int(4) | NO | | 0 | |
| CREATED_DATE | datetime | NO | | | |
| CREATED_BY | varchar(20) | NO | | | |
| CREATED_PRG_NAME | varchar(20) | NO | | | |
| LAST_MODIFY_DATE | datetime | YES | | NULL | |
| UPDATED_PRG_NAME | varchar(20) | YES | | NULL | |
| UPDATED_BY | varchar(20) | YES | | NULL | |
| FLG_COUNT | int(4) | YES | | 0 | |
+------------------+--------------+------+-----+---------+----------------+
因为 当建立一个UNIQUE 约束时,会自动的给该列加上索引,但是外键列已经有索引了,数据库不允许给同一列加多个索引;然后当alter时
外键的索引已经被加到这张创建好的表上了,再加上UNIQUE 时就会自动使用这个已经存在的索引,而不是重新去建立一个,此时,是可以成功的