对对,我想问的就是“表之间引用一致性的问题”
X中有的每一行数据都是唯一的,而且都与A,B,C,D表中的一个表的一条数据发生唯一的映射,也就是说X表有1000条数据,那么A,B,C,D(数据总合也就为1000)。我想做这样的查询,就是通过A,B,C,D表中的外键,来查询X表中的数据。
所以我就必须,确保在写入数据的时候,两个表中的数据保持同步。

解决方案 »

  1.   

    将一条数据插入表X和表A:
    把插入表X的sql写在插入表A前面就行了
    对表X中的total字段进行更新:
    只管更新就行了,不考虑A的感受
      

  2.   

    首先,引用一致性只在innoDB类型的表上起作用,在MyISAM类型的表上不起作用,所以确定你的表类型是innoDB。然后可以这样创建表,其实主要区别是在外键表上,而不是主键表上,所以X的创建和以往是一样的,不具体写了,大致如下:创建表Xcreate table x
    (
    id int not null auto_increment,
    total int not null,
    primary key ( id ),
    )
    engine = innoDB
    default charset = ....//根据需求自己设置创建表A
    create talbe a 
    (
    name int not null,
    id  int not null,
    type int not null,
    primary key( name ),
    foreign key (id) references x (id) on delete cascade on update cascade
    )这样,在你删除或者修改表X的内容时,表A也会跟着做相应改变,用以保证表间数据的一致性,但是修改表A,并不影响表X。因为引用一致性只关心修改和删除操作,并不对插入操作有任何作用,想一想也知道,表X插入一个数据,表A不会自动跟着插入,因为其他字段是不确定的,所以在插入数据时,需要人为的进行一致性插入,和正常的写法一样,这也就是对于你第2个问题的回答。更新X表的total字段,也不影响A表的数据,所以更新的sql语句也可以正常写 updata...set....,这是对第3个问题的回答。我也是新手,理解有限,如果高手有更好的方法,也希望给出,我也学习一下。
      

  3.   

    创建表A改一下,写漏了
    创建表A
    create talbe a
    (
    name int not null,
    id int not null,
    type int not null,
    primary key( name ),
    foreign key (id) references x (id) on delete cascade on update cascade
    )
    engine = innoDB
    default charset = ....//根据需求自己设置
      

  4.   

    关键是我在向x表插入数据的时候,我不知道我插入的这条数据的id是多少啊。。我怎么样可以做到在插入x表后,再从x表中拿到刚刚插入的数据的id,然后再和其他数据放在一起插入表A 呢?实在不好意思。我是真的新手,希望先生再指教一下。。
      

  5.   

    用mysql_insert_id()可以获得上一次插入操作所产生的id;大概是这样mysql_query( "insert into x....");
    $last_id = mysql_insert_id();
    mysql_query("insert into a (name,id ,type) values (***,".$last_id.",***) ");