Search code examples
sqlmysqlgitorious

Restoring SQL table into new table with more columns


I'm trying to salvage a Gitorious installation that has gone bad. I've dumped the SQL table using mysqldump, but now I'm running into the problem that the new version of Gitorious changed its SQL schema in a few places.

In particular, the old version has a table taggings, which looks like

mysql> describe taggings;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| tag_id        | int(11)      | YES  | MUL | NULL    |                |
| taggable_id   | int(11)      | YES  | MUL | NULL    |                |
| taggable_type | varchar(255) | YES  |     | NULL    |                |
| created_at    | datetime     | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

In the new version, this table has gotten three extra columns:

mysql> describe taggings;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id            | int(11)      | NO   | PRI | NULL    | auto_increment |
| tag_id        | int(11)      | YES  | MUL | NULL    |                |
| taggable_id   | int(11)      | YES  | MUL | NULL    |                |
| taggable_type | varchar(255) | YES  |     | NULL    |                |
| created_at    | datetime     | YES  |     | NULL    |                |
| tagger_id     | int(11)      | YES  |     | NULL    |                |
| tagger_type   | varchar(255) | YES  |     | NULL    |                |
| context       | varchar(255) | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)

so that

grep 'INSERT INTO `taggings`' inuse.sql | mysql -uroot gitorious_production

fails with

ERROR 1136 (21S01) at line 1: Column count doesn't match value count at row 1

Is there an easy way to tell MySQL that the final two fields should be left at their default value, NULL?

(The new Gitorious' taggings table starts out empty.)


Solution

  • As a general best practice, you should mention the field names in which you're inserting :

    Insert into taggings (id,tag_id,taggable_id,taggable_type,created_at) values (...your values...)