On Nov 12, 2007 6:42 PM, Lev Lvovsky <[EMAIL PROTECTED]> wrote:
>
>> We have tables in our database that, in addition to primary key
>> constraints also have unique() constraints of several columns in the
>> table:
>>
>> CREATE TABLE Test (
>>        COL1    INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
>>        COL2    VARCHAR(10) NOT NULL,
>>        COL3    VARCHAR(10) NOT NULL,
>> UNIQUE(COL2, COL3);
>> );
>>
>> There are two insert scenarios which would cause a DUPLICATE KEY
>> error - one which contained a pre-existing COL1 value, and another
>> which contained a pre-existing COL2,COL3 value.  Is there any way to
>> differentiate between which KEY, 'PRIMARY', or 'UNIQUE' (as listed by
>> the 'show create table Test' in the mysql client) was actually
>> violated in the last insert?
>>
>> This is specifically for use with the "ON DUPLICATE KEY UPDATE"
>> clause.  Normally we use behavior this to produce a no-op upon adds
>> of identical records, however this can cause problems in the case
>> that the KEY that was DUPLICATE was in fact the UNIQUE() key, and not
>> the PRIMARY key.  Knowing which of these triggered the DUPLICATE key
>> error would be helpful in determining what to do next - is this
>> information stored anyplace?


> On Nov 12, 2007, at 1:27 PM, Michael Dykman wrote:
>
> > When I last researched the question, maybe 6 months ago, the sad truth
> > was (and liely still is): no, there is no way to distinguish between
> > your various unique keys when the duplicate key contraint is raised..
> >
> >  - michael dykman
>
> Thanks for your reply Michael.
>
> In our code, we're running this via a stored procedure (for security)
> - is the only choice at this point, to do a SELECT, to check whether
> the record exists, and subsequently INSERT only if we return no rows?
>
> That seems like the wrong way to do it, but I'll definitely use it if
> it's my only choice.

I had a similar issue in a fairly sophisticated migration
application.. in that case I was <fortunate> enough to have data
available in my procedure that allowed me to disambiguate logically
without another hit to the database..



-- 
 - michael dykman
 - [EMAIL PROTECTED]

 - All models are wrong.  Some models are useful.

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

Reply via email to