SQL插入数据的几种方式

INSERT 用来将行插入(或添加)到数据库表。插入有几种方式:

  • 插入完整的行;
  • 插入行的一部分;
  • 插入某些查询的结果。

 

1.1 插入完整的行

存储到表中每一列的数据在VALUES 子句中给出,必须给每一列提供一个值。如果某列没有值,则应该使用NULL 值(假定表允许对该列指定空值)。各列必须以它们在表定义中出现的次序填充。基本的INSERT 语法:

\
 

使用上面的语法虽然简单,但是并不安全,应该尽量避免使用。因为上面的SQL语句依赖于表中列定义的顺序,还依赖于其获得的次序信息,即使可以得到这种次序信息,也不能保证各列在下一次表结构变动后保持完全相同的次序。因此,不建议编写依赖于特定列次序的SQL。

更可靠的版本(也更繁琐)如下:

\
 

提示:总是使用列的列表

不要使用没有明确给出列的INSERT 语句。给出列能使SQL 代码继续发挥作用,即使表结构发生了变化。

 

1.2 插入部分行

使用INSERT 的推荐方法是明确给出表的列名。使用这种语法,还可以省略列,这表示可以只给某些列提供值,给其他列不提供值。

注意:省略列

如果表的定义允许,则可以在INSERT 操作中省略某些列。省略的列必须满足以下某个条件:

  • 该列定义为允许NULL 值(无值或空值)。
  • 在表定义中给出默认值。这表示如果不给出值,将使用默认值。

 

1.3 插入检索出的数据

INSERT语句可以将SELECT 语句的结果插入表中,这就是所谓的INSERT SELECT。

假如把另一表中的顾客列合并到Customers 表中,不需要每次读取一行再将它用INSERT 插入,可以如下进行:

\
 

提示:插入多行

INSERT 通常只插入一行。要插入多行,必须执行多个INSERT 语句。INSERT SELECT 是个例外,它可以用一条INSERT 插入多行,不管SELECT语句返回多少行,都将被INSERT 插入。

 

2. 从一个表复制到另一个表

使用SELECT INTO将数据复制到一个新表(有的DBMS 可以覆盖已经存在的表,这依赖于所使用的具体DBMS)。看下面的示例:

1 SELECT *
2 INTO CustCopy
3 FROM Customers;

上面的语句创建一个名为CustCopy 的新表,并把Customers 表的整个内容复制到新表中。因为这里使用的是SELECT *,所以将在CustCopy 表中创建(并填充)与Customers 表的每一列相同的列

 

注意事项

  • 任何SELECT 选项和子句都可以使用,包括WHERE 和GROUP BY;
  • 可利用联结从多个表插入数据;
  • 不管从多少个表中检索数据,数据都只能插入到一个表中。

 

提示:进行表的复制

  • SELECT INTO 是试验新SQL 语句前进行表复制的很好工具。先进行复
  • 制,可在复制的数据上测试SQL 代码,而不会影响实际的数据。
在PHP中,防止数据重复插入数据库主要有以下几种方式: 1. **使用唯一索引(Unique Indexes)**:在MySQL等支持的数据表上创建唯一约束或唯一索引,对于需要保证唯一性的字段,如主键,可以确保数据不会重复插入。 ```php $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $stmt = $pdo->prepare("INSERT INTO users (email) VALUES (:email) ON DUPLICATE KEY UPDATE email = :email"); $stmt->execute(['email' => $email]); ``` 这里`ON DUPLICATE KEY UPDATE`会检查该email是否已经存在,如果存在则更新而不是插入。 2. **使用唯一键(UNIQUE Constraints)**:对表中的特定列设置唯一键,这将强制检查新插入的值是否已存在于表中,若存在则插入失败。 ```sql ALTER TABLE users ADD UNIQUE (email); ``` 3. **自增ID结合事务(Transaction)**:在尝试插入之前先查询是否存在相同的ID,如果有则回滚事务,避免重复插入。 ```php $db = new PDO(...); try { if ($db->query("SELECT * FROM users WHERE id = ?", [$id])->rowCount()) { throw new Exception('Duplicate entry'); } // 插入操作 } catch (\Exception $e) { // 回滚事务 $db->rollBack(); } ``` 4. **使用预处理语句(Prepared Statements)**:利用预处理语句可以防止SQL注入,并能通过绑定参数自动处理重复插入。 ```php $stmt = $pdo->prepare("INSERT INTO users (email) VALUES (?) ON DUPLICATE KEY UPDATE email = ?"); $stmt->execute([$email, $email]); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值