On 2016/11/21 9:57 PM, Vikas Aditya wrote:
Hi everyone,
I have a DB migration question. I have a table called "employees" and it has a UNIQUE constraint on
"employee_email". With some new features being requested, I need to relax the constraint and have a new
constraint on "employee_email" + "employee_number". Since SQLite ALTER table command can't modify
an existing constraint, I have thought about creating a new table with the new constraint and then copying everything
from old table to new table and afterwards dumping the old table. It does work but my question is what is the fastest
and most memory efficient way to copy data from old table to new table?
Firstly, are you sure about this constraint relaxing? Basically by
altering the constraint you are saying (in standard English) that you
believe there CAN be an entry where two people with different
Employee-numbers could have the same e-mail address, or, put another
way, you believe that there could be two different people with different
e-mail addresses which could have the same employee number... Which
doesn't sound like any company I know of - usually any employee within a
company must have both a unique e-mail address and unique employee
number. (It might be different but valid for you, I'm just suggesting to
double-check the premise for that decision).
Currently we are using:
sql = "INSERT INTO {} SELECT * FROM {}".format(totable, fromtable)
cur.execute(sql)
So, a single line statement can copy from old to new. But will this work fine
even if I have 100s of thousands of records in old table? Or will this load
pretty much entire data into memory and then copy to new?
Looking for other optimal ways to copy data from one table to another if this
is not optimal.
Your example would work great - SQLite is very good at doing this and it
would use memory correctly.
It is of course unlikely a relaxed constraint would fail when copying
from a table with a more strict set, but it is possible, and it is
possible something else might go wrong, so just to be sure, start a
transaction before renaming the old table, making the new table and
copying the data (you can do all of that in one set of instructions),
then commit or rollback based on the result from the cur.execute().
Good luck!
Ryan
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users