Assuming I have a table like the one below:
create table filetype_filestatus (
id integer(11) not null auto_increment,
file_type_id integer(11) not null,
file_status_id integer(11) not null,
)
I want to add a sequence column like so:
alter table filetype_filestatus add column sequence integer(11) not null;
alter table filetype_filestatus add unique key idx1 (file_type_id, file_status_id, sequence);
Now I want to add the column, which is straightforward, and populate it with some default values that satisfy the unique key.
The sequence column is to allow the user to arbitrarily order the display of file_status for a particular file_type. I’m not too concerned by the initial order since that can be revised in the application.
Ideally I would end up with something like:
FileType FileStatus Sequence
1 1 1
1 2 2
1 3 3
2 2 1
2 2 2
The best I can think of is something like:
update filetype_filestatus set sequence = file_type_id * 1000 + file_status_id;
Are there better approaches?
Hmm, I believe this should work:
I’d recommend adding the new column to the table, running the
alter tablestatement (and getting the default of 0), run the update statement, then add the constraint (well, you have to anyways). Anything that gets touched updates to asequencegreater than 0, so this can be safely run multiple times, too.EDIT:
As @Dems has pointed out, the subquery is being run before the update, and so the above doesn’t actually work for this purpose. It does work on single-line inserts (which doesn’t help at all here).
EDIT:
Gah, you have an
idcolumn, this works just fine (and yes, I tested this one first).Don’t know about the performance implications, though.