In article <[EMAIL PROTECTED]>,
Scott Haneda <[EMAIL PROTECTED]> writes:

> I am not sure this is just how it is, my issue, or a bug, I searched the
> bugs database, but don't really know what to call this in order to properly
> look up the info:

> MySQL 4.0.18-standard

> CREATE TABLE `addresses` (
>   `id` int(11) NOT NULL auto_increment,
>   `user_id` int(11) NOT NULL default '0',
>   `first_name` varchar(48) NOT NULL default '',
>   `last_name` varchar(48) NOT NULL default '',
>   `email_address` varchar(48) NOT NULL default '',
>   `updated` timestamp(14) NOT NULL,
>   `added` timestamp(14) NOT NULL default '00000000000000',
>   PRIMARY KEY  (`id`),
>   UNIQUE KEY `emailuid` (`email_address`,`user_id`)
> ) TYPE=InnoDB PACK_KEYS=0 COMMENT='foo';

> CREATE TABLE addresses_incampaign (
>   id int(11) NOT NULL auto_increment,
>   user_id int(11) NOT NULL default '0',
>   address_id int(11) NOT NULL default '0',
>   campaign_id int(11) NOT NULL default '0',
>   updated timestamp(14) NOT NULL,
>   added timestamp(14) NOT NULL default '00000000000000',
>   PRIMARY KEY  (id),
>   UNIQUE KEY address_id (address_id)
> ) TYPE=InnoDB PACK_KEYS=0 COMMENT='bar';

> As you can see, I have a unique key on addresses.email_address and
> addresses.user_id, note the unique key on address_id in the second table.

> I insert the following data TWICE:

> INSERT IGNORE INTO `addresses`
> (`user_id`,`first_name`,`last_name`,`email_address`) VALUES (1, 'Claire',
> 'Altman', '[EMAIL PROTECTED]');
> INSERT IGNORE INTO `addresses_incampaign` (`user_id`, `address_id`,
> `campaign_id`) VALUES (1,LAST_INSERT_ID(), 2);

> Notice I am picking up the last_insert_id in the second insert, I then
> insert that data again, since I am using insert ignore and since there are
> unique keys on this, I should only still have one records in each table.

> Results are as follows:
mysql> select * from addresses;
> +-----+---------+------------+-----------+---------------+
> | id  | user_id | first_name | last_name | email_address |
> +-----+---------+------------+-----------+---------------+
> | 148 |       1 | Claire     | Altman    | [EMAIL PROTECTED]     |
> +-----+---------+------------+-----------+---------------+
> 1 row in set (0.00 sec)

mysql> select * from addresses_incampaign ;
> +-----+---------+------------+-------------+
> | id  | user_id | address_id | campaign_id |
> +-----+---------+------------+-------------+
> | 128 |       1 |        148 |           2 |
> | 129 |       1 |        149 |           2 | <- SOULD NOT HAVE HAPPENED
> +-----+---------+------------+-------------+
> 2 rows in set (0.00 sec)

> Record 129 should not have been inserted, it should not have ever gotten a
> insert ID back from mysql, mysql said back 149, which is in fact the next
> record, but no new record was added to addresses so it really is not valid.

> Workarounds and suggestions?

The behavior is indeed strange, but it's not a bug, since it's documented:

     If you use `INSERT IGNORE' and the record is ignored, the
     `AUTO_INCREMENT' counter still is incremented and
     `LAST_INSERT_ID()' returns the new value.

The solution is, of course, not to use INSERT IGNORE at all.  You
should instead catch any error, check that it's ER_DUP_KEY and not try
the second INSERT in that case.


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to