表1
CREATE TABLE `user_info` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `salary_range_id` int(11) NOT NULL,
  PRIMARY KEY (`user_id`),
  KEY `user_info_salary_range_id` (`salary_range_id`),
  CONSTRAINT `user_info_salary_range_id` FOREIGN KEY (`salary_range_id`) REFERENCES `salary_range` (`salary_range_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;表2
CREATE TABLE `salary_range` (
  `salary_range_id` int(11) NOT NULL AUTO_INCREMENT,
  `salary` int(11) NOT NULL,
  PRIMARY KEY (`salary_range_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;存储过程
CREATE DEFINER=`root`@`localhost` PROCEDURE `createUser`(
  IN v_salary_range int
)
BEGIN
  insert into user_info (
  user_id,
  salary_range_id
  )
  values (
  null,
  v_salary_range
  );
END;call createUser(0)为什么这样不行呀?怎么设计表才行呀?我的数据处理就是call 0

解决方案 »

  1.   

    1、一般不用自增字段做外键;
    2、自增字段一般从1开始,从0开始要设置
    INSERT INTO salary_range VALUES(0,1);
    CALL createUser(0);
    3、插入要从主表开始,不能从子表开始
      

  2.   


    可能是我没说清楚,刚开始插入user_info的时候salary_range_id是没有数据的,所以我就处理插入0
      

  3.   

    先要插入`salary_range`,如果你一定要先插入user_info
    SET FOREIGN_KEY_CHECKS = 0;
    CALL createUser(0);
      

  4.   

    SET FOREIGN_KEY_CHECKS = 0;
    CALL createUser(0);
    SET FOREIGN_KEY_CHECKS = 1;
      

  5.   

    那你需要先初始化一下salary_range表,添加这个0的记录。
    否则由于这个0在salary_range中不存在,就违反了外键的限制。参照其它表的AUTO_INCREMENT字段这外键,这个在表设计中很常见,没有什么问题。
      

  6.   


    salary_range这个表是有数据的,从1开始,在插入user_info时salary_range_id插入0,以后更新再插入,我是这个意思,没有别的办法了吗?
      

  7.   

    没有,你有外键关系,ORSET FOREIGN_KEY_CHECKS = 0;
    CALL createUser(0);
    SET FOREIGN_KEY_CHECKS = 1;
      

  8.   

    2、自增字段一般从1开始,从0开始要设置
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";