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);大家给个理由,平时还真没注意这个问题。

解决方案 »

  1.   

    T_USER在T_ACCOUNT建立之前就有?还是在T_ACCOUNT建立之后
      

  2.   

        *  两个表必须是InnoDB表类型。
        * 使用在外键关系的域必须为索引型(Index)。
        * 使用在外键关系的域必须与数据类型相似。
      

  3.   

    示例:
    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; 这样可以
      

  4.   

    T_USER在T_ACCOUNT建立之前就有? 当然有了!
     *  两个表必须是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; 如上可以创建外键。
      

  5.   

    MYSQL版本?
    T_USER
    建表SQL?
      

  6.   

    UNIQUE->PRIMARY KEY试试
    假设A,ID 主键。
        B,AID外键。
    那么
    1、A 和B必须都是INNODB引擎。
    2、ID 和AID 类型、长度必须一致。
    3、AID 必须是KEY.
    4、foreign key 的名字必须在整个库是唯一的。
      

  7.   

    你的shirt 表用desc命名查看是 KEY --MUL
    现在的主要问题是即是外键又有唯一约束直接创建可否行的通。desc 后KEY --uni类型!!
      

  8.   

    根本没有出错信息!!但是SQLyou 索引列只显示三个!!我用了ALTER后索引列就是四个了!!
      

  9.   

    T_USER我做了一个示例,简单一个字段,你试试,在MYSQL5。1.17下测试通过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;
      

  10.   

    删除要从T_ACCOUNT开始,索引只有3个,外键是有的drop table if exists T_ACCOUNT;
    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; 
      

  11.   

    你写的当然可以!!但是DESC T_ACCOUNT;  USER_IDKETMUL这样的外键形成了one--to --many如果有唯一约束就是变相的one--to--one,这样的好处是不言而喻的。
    需要的结果是:但是DESC T_ACCOUNT;  USER_IDKETUNI
      

  12.   

    T_ACCOUNT中USER_ID也要唯一?
    T_USER中的USER_ID是唯一的?
      

  13.   

    drop table if exists T_ACCOUNT;
    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下测试通过
      

  14.   


    我开始也这么写的,但是用sqlyou查看INDEXS时就有三个索引列1:ACC_ID  PRI
    2:UN_ACC_NAME 
    3:UN_USER_ID 反倒没有FK_USER_ID   你用什么方式查看的?
      

  15.   

    点右键,选择RELATIONSHEIPS/FOREIGNKEY
      

  16.   

    点右键,选择RELATIONSHIPS/FOREIGNKEYs 查看
      

  17.   

    mysql> DESC T_ACCOUNT;
    +------------------+--------------+------+-----+---------+----------------+
    | 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       |                |
    +------------------+--------------+------+-----+---------+----------------+
      

  18.   

    以上是通过ALTER  下边这个是直接创建http://p.blog.csdn.net/images/p_blog_csdn_net/APOLLO_TS/EntryImages/20090410/screenshot3.gif原来是软件问题。
      

  19.   

    应该是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); 这句的结果,加了一个INDEX,一个外键,可以不用
      

  20.   

    很感谢 WWWWA   100分奖励你的热情。敬礼。
      

  21.   

    我认为是索引的问题引起的 
    因为 当建立一个UNIQUE  约束时,会自动的给该列加上索引,但是外键列已经有索引了,数据库不允许给同一列加多个索引;然后当alter时
    外键的索引已经被加到这张创建好的表上了,再加上UNIQUE 时就会自动使用这个已经存在的索引,而不是重新去建立一个,此时,是可以成功的