我正在尝试使用PostgreSQL数据库在 PHP中开发一个Q& A网站.

我有一个动作来创建一个页面,其中包含标题,正文,类别和标签.我设法插入所有这些字段,但是我在插入多个标记值时遇到了一些问题.

我使用这个函数将逗号分隔的值放到一个数组中,现在我想要一些东西将每个数组元素插入到表标记的数据库中(避免重复),然后插入我的多对多关系表问题标签:

$tags = explode(',', $_POST['tags']); //Comma separated values to an array

打印这样的东西:

Array ( [0] => hello [1] => there [2] => this [3] => is [4] => a [5] => test )

动作/ create_question.php

$category = get_categoryID_by_name($_POST['category']);

$question = [

'userid' => auth_user('userid'),

'body' => $_POST['editor1'],

'title' => $_POST['title'],

'categoryid' => $category

];

create_question($question, $tags);

然后我的create_question我应该插入标签.

function create_question($question, $tags) {

global $conn;

$query_publications=$conn->prepare("SELECT * FROM insert_into_questions(:body, :userid, :title, :categoryid);

");

$query_publications->execute($question);

}

我在考虑做这样的事情:

全球$conn;

foreach ($tags as $tag) {

$query_publications=$conn->prepare("INSERT INTO tags(name) VALUES($tag);

");

$query_publications->execute($question);

}

但后来我需要在我的多对多表中插入标签id.我是否需要创建另一个过程get_tags_id然后获取tag_id数组并在我尝试标记时插入它们?

我什么时候执行查询?插入后或彼此结束?

对于任何误用的术语或我的新手问题,我们深表歉意.我是PHP的新手,我正在努力解决一些新概念.

最佳答案 您可以使用CTE在一个SQL命令中完成所有操作.

假设Postgres 9.6和这个经典的多对多模式(因为你没有提供它):

CREATE TABLE questions (

question_id serial PRIMARY KEY

, title text NOT NULL

, body text

, userid int

, categoryid int

);

CREATE TABLE tags (

tag_id serial PRIMARY KEY

, tag text NOT NULL UNIQUE);

CREATE TABLE questiontags (

question_id int REFERENCES questions

, tag_id int REFERENCES tags

, PRIMARY KEY(question_id, tag_id)

);

要使用标记数组插入单个问题:

WITH input_data(body, userid, title, categoryid, tags) AS (

VALUES (:title, :body, :userid, :tags)

)

, input_tags AS ( -- fold duplicates

SELECT DISTINCT tag

FROM input_data, unnest(tags::text[]) tag

)

, q AS ( -- insert question

INSERT INTO questions

(body, userid, title, categoryid)

SELECT body, userid, title, categoryid

FROM input_data

RETURNING question_id

)

, t AS ( -- insert tags

INSERT INTO tags (tag)

TABLE input_tags -- short for: SELECT * FROM input_tags

ON CONFLICT (tag) DO NOTHING -- only new tags

RETURNING tag_id

)

INSERT INTO questiontags (question_id, tag_id)

SELECT q.question_id, t.tag_id

FROM q, (

SELECT tag_id

FROM t -- newly inserted

UNION ALL

SELECT tag_id

FROM input_tags JOIN tags USING (tag) -- pre-existing

) t;

dbfiddle here

这会创建任何尚未存在的标记.

Postgres数组的文本表示如下所示:{tag1,tag2,tag3}.

如果保证输入数组具有不同的标记,则可以从CTE input_tags中删除DISTINCT.

详细说明:

> Insert data in 3 tables at a time using Postgres

> How to use RETURNING with ON CONFLICT in PostgreSQL?

> How to implement a many-to-many relationship in PostgreSQL?

> Cannot INSERT: ERROR: array value must start with “{” or dimension information

如果您有并发写入,则可能需要执行更多操作.特别考虑第二个链接.

php拼接多个insert,php – 将多个INSERTS分成一个表和多个表相关推荐

  1. php mysql insert 拼接_php mysql insert into 结合详解及实例代码

    PHP MysqL insert into 结合详解 ysql INSERT INTO语句在实际应用中是经常使用到的语句,所以对其相关的内容还是多多掌握为好. 向数据库表插入数据 INSERT INT ...

  2. oracle数据库【表复制】insert into select from跟create table as select * from 两种表复制语句区别...

    create table  as select * from和insert into select from两种表复制语句区别 create table targer_table as select ...

  3. 连接excel执行Insert Into语句出现“操作必须使用一个可更新的查询”的解决

    C#使用oledb连接excel执行Insert Into语句出现"操作必须使用一个可更新的查询"的解决办法 我发生错误时的环境:Windows 7,Framework 4.0,M ...

  4. SQL Server Insert 操作效率(堆表 VS 聚集索引表)

    "SQL Server的Insert操作在堆表或者聚集索引表的时候,哪个效率更高?为什么高?" 之前有同事问过我这个问题,为了确保日志库的记录效率,于是我做了简单测试了,首先要先强 ...

  5. server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...

    4.1.查询的类型 declare @value as int set @value = 50 select  'age:'as age,2008 years,@valueas va --这种查询时跟 ...

  6. 想要将多个视频拼接在一起?如何把三个视频合成一个视频

    从事短视频创作行业以来,总是存在着各种挑战.最开始,因为主要负责视频素材的搜集,所以每天虽忙但充实,最近逐步开始学习视频的剪辑工作,可把我难到了!想要将多个视频拼接在一起?如何把三个视频合成一个视频? ...

  7. 将EXCEL中的列拼接成SQL insert插入语句

    工作中经常需要将EXCEL文件中的数据导入到各种数据库,但是对于不熟悉数据库的人来说,如果直接使用命令执行导入,这无疑是一个难题,也是一个风险.这里我们直接在EXCEL文件中拼接成标准的SQL ins ...

  8. mysql 使用select建表_mysql create创建表、insert into插入数据、select查询数据实例

    mysql创建表的sql代码如下: CREATE TABLE Employee( id int, first_name VARCHAR(15), last_name VARCHAR(15), star ...

  9. 创建表结构相同的表,表结构相同的表之间复制数据,Oracle 中 insert into XXX select from 的用法...

    /**1. 用select 创建相同表结构的表*/ create table test_tbl2 as select * from test_tbl1 where 1<>1; /**   ...

最新文章

  1. 全民IT时代到来了?学计算机很有前途?——淘宝2011校园招聘笔试感想
  2. C/C++ 电子书推荐
  3. bat 服务启动脚本
  4. 计算机考试网络应用题一定要做到ie浏览器,网络远程教育统考单项练习:计算机应用基础之Internet应用部分(二)...
  5. 华为手机锁屏下拉怎么设置_华为手机怎么设置锁屏
  6. JAVA的嵌入式脚本开发(上)
  7. Python:PyCharm提示“Python version 2.7 does not support a ‘F‘ prefix”
  8. android充电器 充苹果,安卓充电器能给iPhone 12快充吗?实测小惊喜
  9. 怎么更改AD域用户账号和密码_AD域管理中那些实用的软件
  10. ms settings personalization
  11. jemalloc 深入分析 之 Tcache 实现原理
  12. 智能网联汽车——传感器与驾驶辅助
  13. 使用单链表制作电子通讯录
  14. Excel数据分析系列(5):Excel 数据可视化
  15. 计算机的四个发展阶段的应用,计算机分为哪四个发展阶段
  16. 生活随记 - 含苞待放
  17. web前端各种浏览器版本测试工具-turbo
  18. 电磁场主要应用在哪些领域
  19. MariaDB的安装步骤
  20. 搭建第一个scrapy项目的常见问题

热门文章

  1. undertow服务器分析_使用undertow构建和测试Websocket服务器
  2. 滑动拼图验证码操作步骤:_拼图项目:延期的后果
  3. 在Gradle 2.13中更好地处理“在插件Y上找不到属性X”
  4. 使用Google Guava Cache进行本地缓存
  5. 在Spring中使用Netflix Hystrix批注
  6. AEM中的单元测试(大声思考)
  7. 使用Java EE 7,WildFly和Docker进行连续部署–(第1部分)
  8. Hazelcast入门指南第1部分
  9. 如何在Maven中运行Ant目标?
  10. Apache Shiro第3部分–密码学