2012-01-11 5 views
0

Если у меня есть таблица, называемая Места с несколькими полями и идентификатором primaryID основного ключа, что, если лучший способ ВСТАВИТЬ новый элемент в таблицу, так что placeID автоинкремент, но все остальные поля те же, что и элемент с placeID = 001, скажем.Операторы SQL SELECT и INSERT вместе

Это то, что я делаю

SELECT* FROM Places WHERE placeID = 001 ... 
INSERT INTO Places VALUES(...should be values from previous select) 

, но я не могу вполне понять, как это сделать.

ответ

4

Вы просто его назад, и вы должны явно назвать столбцы, с каждой колонкой кромеplaceID в SELECT списке:

INSERT INTO places (col1, col2, col3, col4, every_column_except_placeID) 
    SELECT col1, col2, col3, col4, every_column_except_placeID FROM Places WHERE placeID='001' 

Вы должны получить новую строку с placeID автоинкрементными.

+0

Практически правильно, но вам нужно либо указать каждый столбец INCLUDING placeID, либо указать конкретные столбцы, которые вы будете выбирать. Вставьте в места (col1, col2, col3, col4, everycolumn_except_palceID) (выберите col1, col2, col3, col4, everycolumn_except_palceID из мест ...) – atxdba

+0

@atxdba Уже исправлено, возможно, когда вы комментировали: –

+0

+1 это тогда. .. – atxdba

0

Если это похоже на беспорядок в одном выражении SQL, то я разбиваю его и использую больше ресурсов. Для крупных сетевых приложений, которые должны сжимать каждую каплю производительности - это плохое решение.

Однако в большинстве случаев для менее требовательных обстоятельств хороший визуально-логический процесс в порядке.

Я бы выбрал свою информацию и использовал внутренний цикл языка более высокого уровня, чтобы отбросить результаты в оператор insert. Я недостаточно наказую, чтобы сделать больше вложений. На многих общих хостах существует ограничение на количество запросов, которые вы можете сделать за определенный период времени, поэтому, возможно, вам нужно создать меньше, но более крупных операторов вставки.

Для этого я, скорее всего, буду использовать PHP для обработки своих данных и SQL, я уверен, что следующее может быть адаптировано к любому языку, который вы хотели бы использовать.

<!php 
$placeid=001 

$sql1="SELECT column,othercolumn,maybeasterisk FROM table1 WHERE PlaceID=$placeid"; 
$sql2="INSERT into table2 (column,othercolumn,thirdcolumn,whymore,so-on) VALUES ('$data1a','$data1b','$data1c','$data1d','$data1e')"; 
$sql3="INSERT into table2 (column,othercolumn,thirdcolumn,whymore,so-on) VALUES $bigstring"; 

$counter=0; 

$result1=mysql_query($sql1); 
while ($resultrow1=mysql_fetch_array($result1)) { 

$data1a=$resultrow1['1']; 
$data1b=$resultrow1['2']; 
$data1c=$resultrow1['3']; 
$data1d=$resultrow1['whymore']; 
$data1e=$resultrow1['so-on'];  

if ($abillioninsertsareokay='true') { 
mysql_query($sql2); 
} 

else { 
//a billion inserts isn't okay 
//build an array that we can use in a separate loop 
for ($i=0, $i<=5, $i++) { 
$sql3arraydata['$counter']['$i'] 
$counter++ 
} 

} 

$counter=0; 

if ($abillioninsertsareokay!='true') { 
foreach $sql3arraydata['$counter'] { 

if ($counter>0) { 
$bigstring.=', '; 
} 

$bigstring.="('$sql3arraydata['$counter'][1]','$sql3arraydata['$counter'][2]','$sql3arraydata['$counter'][3]','$sql3arraydata['$counter'][4]','$sql3arraydata['$counter'][5]')"; 
} 

mysql_query($sql3); //one huge insert statement 

} 

?> 

It may be the wrong way to look at things, but sometimes you just have to crank out mediocre code that works to get the job done. Yes, that would be great if you had all the time in the world to make it super awesome, but if this is the kind of question you are asking-- probably not a mission critical system for a mass amount of people.