Hi,

If a "parent" table has multicolumn primary key
AND     "child" table have a constraint to one column of this "parent"
primary key (let's say column "id_a")
AND     there are more records in "parent" table having the same value
of "id_a" (let's say "id_a"==1)
AND     "child" table has record with "id_a"==1
THAN    it is not possible to UPDATE or DELETE any rows of "parent"
table, which has "id_a"==1

I hope you can use the following example to repeat the problem and fix
this bug

Thank you

Jan Mazánek
[EMAIL PROTECTED]

#
========================================================================
===========
# Incorrect handling of foreign key constraints in InnoDB tables in
MySQL 3.23.55-max
# run on Windows ME
#
========================================================================
===========
#       EXAMPLE

# ============================================================
#   Table: zbozi_skupina          # parent table              
# ============================================================
create table zbozi_skupina
(
    id                           INTEGER                default '1' not
null AUTO_INCREMENT,
    valid_to                     INTEGER                default
'2147166000' not null,
    valid_from                   INTEGER                default '1' not
null,
    akce                         VARCHAR(64)            default
'zbozi_vypis' not null,
    constraint pk_zbozi_skupina primary key (id, valid_to)
)TYPE=InnoDB;

# ============================================================
#   Table: zbozi_skupina_strom    # child table               
# ============================================================
create table zbozi_skupina_strom
(
    id_parent                    INTEGER                default '1' not
null,
    id_child                     INTEGER                default '1' not
null,
    constraint pk_zbozi_skupina_strom primary key (id_parent, id_child)
)TYPE=InnoDB;


# ============================================================
#   Index: fk_skupina_zbozi_nadrizena                         
# ============================================================
create index fk_skupina_zbozi_nadrizena on zbozi_skupina_strom
(id_parent asc);


# ============================================================
#   Index: fk_skupina_zbozi_podrizena                         
# ============================================================
create index fk_skupina_zbozi_podrizena on zbozi_skupina_strom (id_child
asc);


alter table zbozi_skupina_strom
    add constraint fk_zbozi_sk_sz_rodic_zbozi_sk foreign key  (id_child)
       references zbozi_skupina (id);


alter table zbozi_skupina_strom
    add constraint fk_zbozi_sk_sz_dite_zbozi_sk foreign key  (id_parent)
       references zbozi_skupina (id);



------------------------------------------------------------------------
----
INSERT INTO `zbozi_skupina`     ( `id`, `valid_to`,     `valid_from`,
`akce`)
VALUES                          ( '1',  '2147166000',   '1',
'zbozi_vypis');

INSERT INTO `zbozi_skupina`     ( `id`, `valid_to`,     `valid_from`,
`akce`)
VALUES                          ( '1',  '1',    '1',
'zbozi_vypis');

#       Correct:
#       At this point it is possible to:
#                       DELETE FROM zbozi_skupina WHERE id=1 AND
valid_to='2147166000'
#       AND/OR: DELETE FROM zbozi_skupina WHERE id=1 AND valid_to='1'

INSERT INTO `zbozi_skupina_strom` ( `id_parent` , `id_child`) 
VALUES ('1', '1');


#       INCORRECT:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#       At this point it is NOT possible to:
#       1)      DELETE FROM zbozi_skupina WHERE id=1 AND
valid_to='2147166000'
#       2) OR   DELETE FROM zbozi_skupina WHERE id=1 AND valid_to='1'
#       3) OR   UPDATE zbozi_skupina SET valid_to=2 WHERE id='1' AND
valid_to= '1' 
#       4) OR   UPDATE zbozi_skupina SET id='2' WHERE id='1' AND
valid_to='1' 
#
#       MySQL reports: Cannot delete a parent row: a foreign key
constraint fails
#       It is not true!
#       Constraints are defined only for column zbozi_skupina.id AND
#       there are two rows having id=='1'.
#
#       It should be possible to do anything to one of these two rows!
#       (There would still be at least one row having id=='1')
#
#       It should be possible to update zbozi_skupina.valid_to for BOTH
of these rows!
#       (There is no impact on zbozi_skupina.id)
#
#       I think that constraints in MySQL behave in this incorrect way:
#       If there is a child table having constraint to the row which is
tried to be DELETEd/(UPDATEd primary key)
#       MySQL returns error
#
#       The correct behavior should be:
#       If there is a child table having constraint to the row which is
tried to be DELETEd/(UPDATEd primary key)
#       CHECK if there exists another row with the same part of primary
key
#       OR CHECK if after UPDATE the constraint will be OK
#       IF above checks fails, THAN report error

#       I tried to solve this problem with adding indexes on every
single column, but it didn't help
#       I hope you can use the above example to repeat the problem and
fix this bug

#       Thank you, Honza, [EMAIL PROTECTED]



#       P.S.: If you use ON DELETE CASCADE, than the rows of child table
are deleted. No matter, that there still exists
#       "parent" table with the constrained value of the key (id)





---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to