Description:
I am trying to insert user’s preferences into a database. If the user hasn’t yet placed any, I want a insert, otherwise, I want an update. I know I can insert default values in the creation of the user and than exclusively use update, but that adds another query (I think)
Problem:
I have read up on ON DUPLICATE KEY UPDATE but I don’t understand it. This is almost the exact question I have but without the answer. The answer says:
It does sound like it will work for what you want to do as long as you hav the proper column(s) defined as UNIQUE KEY or PRIMARY KEY.
If I do a simple insert like so:
INSERT INTO table (color, size) VALUES ('blue', '18') ...
How will that ever produce at DUPLICATE KEY? As far as mysql knows it’s just another insert and the id is auto-incremented. I have the primary key in the table set to unique, but the insert isn’t going to check against that, right?
Table:
CREATE TABLE `firm_pref` (
`id` int(9) NOT NULL AUTO_INCREMENT,
`firm_id` int(9) NOT NULL, //user_id in this case
`header_title` varchar(99) NOT NULL,
`statement` varchar(99) NOT NULL,
`footer_content` varchar(99) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
Well, unless you want your application to be used by a single person only, you would have to specify someone’s user_id in that
INSERT– when this ‘someone’ guy or girl updates his/her preferences, right?This field (
user_id) is exactly what would be checked byON DUPLICATE KEY UPDATEclause.And if you want to insert a new record, just send
NULLinstead:… so auto-increment will have a chance to move on and save the day. )
UPDATE: Take note that to understand that some field should be considered a unique identifier, you should mark it as such. Usually it’s done naturally, as this field is used as a
PRIMARY KEY. But sometimes it’s not enough; it means some work forUNIQUEconstraint. For example, in your table it can be used like this:(or you can add this constraint to the existing table with
ALTER TABLE prefs ADD UNIQUE (firm_id)command)Then insert/update query will look like…
I’ve built a sort of demo in SQL Fiddle. You can play with it some more to better understand that concept. )