SQL INSERT INTO SELECT语句语法问题

时间:2016-04-05 18:07:56

标签: mysql

我有4个页面,我需要在其中共享相同的restaurant_ID。我需要能够将ID插入数据库中的所有4个表中。 我使用INSERT INTO SELECT语句来执行此操作。但我收到以下错误:

  

可能的语法错误(检查前面的有效语法错误)    意外:标识符' SELECT'

     

可能的语法错误(检查前面的有效语法错误)        意外:标识符' Resturant_ID'

     

可能的语法错误(检查前面的有效语法错误)        意外:标识符' Rest_Dets'

这是我正在使用的sql:

(原文):

  INSERT INTO Product (Resturant_ID)
  SELECT Resturant_ID Rest_Dets;

(编者):

  INSERT INTO Product (Resturant_ID)
  SELECT Resturant_ID FROM Rest_Dets;

我也试过

  $rest_id = mysqli_real_escape_string($dbc, $_SESSION['Resturant_ID']);
  INSERT INTO Product (Resturant_ID)
  SELECT Resturant_ID FROM Rest_Dets  WHERE Resturant_ID = $rest_id ;

我已经浏览了整个互联网,看起来我不应该有问题,网页也成功连接。

Rest_Details(我希望从中获取Restaurant_ID的表格)

     CREATE TABLE `Rest_Details` (
    `Resturant_ID` bigint(255) NOT NULL AUTO_INCREMENT,
    `Resturant_name` varchar(100) NOT NULL,
    `Resturant_des` varchar(200) NOT NULL,
    `Res_Address_Line_1` varchar(200) NOT NULL,
    `Res_Address_Line_2` varchar(200) DEFAULT NULL,
    `City_name` varchar(100) NOT NULL,
    `Resturant_Postcode` varchar(8) DEFAULT NULL,
    `Cat_ID` tinyint(11) NOT NULL,
    `Avg_Del` tinyint(11) NOT NULL,
    `Est_Del` tinyint(11) NOT NULL,
    `Email1` varchar(200) NOT NULL,
    `Email2` varchar(200) DEFAULT NULL,
    `Min_ord` tinyint(11) NOT NULL,
     PRIMARY KEY (`Resturant_ID`),
     UNIQUE KEY `Resturant_name` (`Resturant_name`),
     UNIQUE KEY `Resturant_ID` (`Resturant_ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

产品

   CREATE TABLE `Product` (
  `Product_Id` bigint(255) NOT NULL AUTO_INCREMENT,
  `Resturant_ID` bigint(255) NOT NULL,
  `Product_Name` varchar(100) NOT NULL,
  `Product_Desc` text NOT NULL,
  `Product_Price` decimal(65,0) NOT NULL,
  `Add_On_ID` int(11) NOT NULL,
   PRIMARY KEY (`Product_Id`),
   UNIQUE KEY `Product_Id` (`Product_Id`),
   UNIQUE KEY `Resturant_ID` (`Resturant_ID`)
   ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8

1 个答案:

答案 0 :(得分:0)

Fred-ii引用 - 您可以阅读https://dev.mysql.com/doc/refman/5.5/en/insert-select.html,它将为您提供您正在寻找的答案:

INSERT INTO Product (Resturant_ID) SELECT Resturant_ID FROM Rest_Dets WHERE <condition>;

其他

  

WHERE Resturant_ID = $ rest_id;

你的字符串(如果是字符串)应该用单引号括起来:

 WHERE Resturant_ID = '$rest_id' ;

正确连接,无论是字符串还是数字:

 WHERE Resturant_ID = '".$rest_id."' ;

顺便说一下,你可以通过简单的方式实现你想要的目标:

INSERT INTO Product(Resturant_ID) VALUES ('".$rest_id."')

(你也拼错了餐馆。)

解决方案

我认为您的评论的解决方案是:

您当前的PHP代码如下:

<?php
...
$rest_id = mysqli_real_escape_string($dbc, $_SESSION['Resturant_ID']);
  INSERT INTO Product (Resturant_ID)
  SELECT Resturant_ID FROM Rest_Dets  WHERE Resturant_ID = $rest_id ;

您正在直接在PHP脚本中键入SQL命令,这会给您在问题中指出的错误,因此您实际应该做的是通过接口管理器运行SQL查询(在本例中是PHP函数,用于设置和执行MySQL命令到服务器。)

请阅读http://php.net/manual/en/book.mysqli.php,它将为您提供有关在PHP脚本中使用MySQLi函数与数据库进行通信的良好指南。

您对mysqli_real_escape_from_newyork_string的引用是我正在进行的一些功能,您应该能够从下面的代码中清楚地看到您错过了什么(我认为):

<?php
/** Error reporting: **/
    error_reporting(E_ALL);
    ini_set('display_errors', 1);

/** Set up the mysqli connection: **/
    $dbc = mysqli_connect("localhost", "my_user", "my_password", "my_db");

/** Next clean your input **/ 
    $rest_id = mysqli_real_escape_string($dbc, $_SESSION['Resturant_ID']);

/** Next run the query **/
    mysqli_query($dbc, "INSERT INTO Product (Resturant_ID)
  SELECT Resturant_ID FROM Rest_Dets WHERE Resturant_ID = ".$rest_id."") 
    or die(__LINE__.": yourSQL Error: ".mysqli_error($dbc));

/** It is good practise for beginniners to add the or die to the end of the code to 
display MySQLi errors. NOT FOR PUBLIC/LIVE WEBSITES **/

/** Finally a success statment! **/
    print "If you can read this then your query worked ok!!";

将上面的代码复制并粘贴到您的页面中并考虑逻辑并调整它以适应当前代码,但我认为这是您缺少的关键。请阅读以下文章:

备注:

  • 请记住,如果您的$rest_id是字符串,则需要将其mysqli_query()
  • 内的单引号括起来
  • localhost可能不是本地的(在运行PHP的同一台机器上),可能在另一台服务器上。
  • 始终尽可能彻底地清理所有输入。永远不要相信任何用户输入。
  • 从不使用MySQL_函数,不再支持它们。使用MySQLi(如此处)或PDO