tags:

views:

672

answers:

4

I have two tables with identical structure except for one column... Table 2 has that additional column in which i would insert the CURRENT_DATE()

I would like to copy all the values from table1 to table2.

if i use

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;

it throws an error pointing out to the difference in the number of columns.

I have two questions on that:

1) How do I get around this?

2) and how do i add the value for the additional date column (CURRENT_DATE()) in table2 within this same statement?

+1  A: 
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;
Zed
there are so many fields in the table, is there are shorter way? If i change the table structure there, i would have to remember to change the php pages too.
you can escape it with dues.*
Zed
+3  A: 

To refine the answer from Zed, and to answer your comment:

INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;
crunchdog
Be **VERY CAREFUL** doing this. It does work, but it assumes the order of columns in the two tables is identical; it does **not** match by column name, and does try to coerce values to fit, which can cause unexpected results. Now, if your development structure assures the column orders are identical bar the last column, it's a convenient and straightforward way to do it, but the caveat is important.
T.J. Crowder
Luckily the order is the same. ill keep in mind to keep the structure identical even in the future. thanks all!
+1  A: 

The safest way to do it is to fully specify the columns both for insertion and extraction. There's no guarantee (to the application) that either of these will be the order you think they may be.

insert into dues_storage (f1, f2, f3, cd)
    select f1, f2, f3, current_date() from dues where id = 5;

If you're worried about having to change many multiple PHP pages that do this (as you seem to indicate in the comment to another answer), this is ripe for a stored procedure. That way, all your PHP pages simply call the stored procedure with (for example) just the ID to copy and it controls the actual copy process. That way, there's only one place where you need to maintain the code, and, in my opinion, the DBMS is the right place to do it.

paxdiablo
yeah.. but i am just starting out. I have to now find out what stored procedures are, thanks! one more thing to learn today!
+1  A: 

Hope this will help someone... Here's a little PHP script I wrote in case you need to copy some columns but not others, and/or the columns are not in the same order on both tables. As long as the columns are named the same, this will work. So if table A has [userid, handle, something] and tableB has [userID, handle, timestamp], then you'd "SELECT userID, handle, NOW() as timestamp FROM tableA", then get the result of that, and pass the result as the first parameter to this function ($z). $toTable is a string name for the table you're copying to, and $link_identifier is the db you're copying to. This is relatively fast for small sets of data. Not suggested that you try to move more than a few thousand rows at a time this way in a production setting. I use this primarily to back up data collected during a session when a user logs out, and then immediately clear the data from the live db to keep it slim.

-Josh

http://www.joshstrike.com

 function mysql_multirow_copy($z,$toTable,$link_identifier) {
         $fields = "";
         for ($i=0;$i<mysql_num_fields($z);$i++) {
          if ($i>0) {
           $fields .= ",";
          }
          $fields .= mysql_field_name($z,$i);
         }
         $q = "INSERT INTO $toTable ($fields) VALUES";
         $c = 0;
         mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. !
         while ($a = mysql_fetch_assoc($z)) {
          foreach ($a as $key=>$as) {
           $a[$key] = addslashes($as);
           next ($a);
          }
          if ($c>0) {
           $q .= ",";
          }
          $q .= "('".implode(array_values($a),"','")."')";
          $c++;
         }
         $q .= ";";
         $z = mysql_query($q,$link_identifier);
         return ($q);
        }
Josh Strike