我正在使用PostgreSQL 9.1.我的数据库是结构化的,以便我的应用程序使用实际的表.对于每个表,都有历史表,仅存储更改历史记录.历史表包含相同的字段,实际表格和字段形成一些额外信息,例如.编辑时间.历史表仅由触发器处理.
我有两种触发器:
Before INSERT 触发器在创建表时向表添加一些额外信息(例如,create_time).Before UPDATE触发器和before DELETE触发器将旧值从实际表复制到历史表.问题是我想使用触发器来存储进行这些更改的用户的ID.而id我是来自php应用程序的id,而不是PostgreSQL用户id.
有没有合理的方法呢?
使用INSERT和UPDATE,可以只将id的额外字段添加到实际表中,并将用户id作为SQL查询的一部分传递给SQL.据我所知,这不适用于DELETE.
所有触发器的结构如下:
CREATE OR REPLACE FUNCTION before_delete_customer() RETURNS trigger AS $BODY$
BEGIN
INSERT INTO _customer (
edited_by,
edit_time,
field1,
field2,
...,
fieldN
) VALUES (
-1, // <- This should be user id.
NOW(),
OLD.field1,
OLD.field2,
...,
OLD.fieldN
);
RETURN OLD;
END; $BODY$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud) 我想在表格的每一列中的每个单元格中添加一些文本作为该特定列的符号.例如,说我的表如下(所有字段都是类型字符变化):
name age location james 45 france simon 33 usa ben 76 china
我想将其修改为:
name age location ajames b45 cfrance asimon b33 cusa aben b76 cchina
有没有人对我如何做到这一点有任何建议?
我正在创建一个.bat文件,我希望将ASCII艺术写入文本文件.
我能够找到在回显文本时向文件添加新行的命令,但是当我读取该文本文件时,我看到的只是布局符号而不是空格.我认为它可以通过Word或甚至写字板打开该文件,但我希望它可以在任何计算机上工作,即使该计算机只有记事本(大多数情况下).
如何在某个程序(即写字板)中打开文本文件或在文件中写入适当的空格字符?
编辑:
我发现这是最好的使用方式:
echo <line1> > <filename>
echo <line2> >> <filename>
Run Code Online (Sandbox Code Playgroud)
PS我|在我的ASCII艺术中使用,所以它崩溃了,Dumb Dumb Dumb :)
我有一张450万行的表.没有主键.该表有一个列p_id,类型为整数.idx_mytable_p_id使用该btree方法在此列上有一个索引.我做:
SELECT * FROM mytable WHERE p_id = 123456;
Run Code Online (Sandbox Code Playgroud)
我对此进行了解释并看到以下输出:
Bitmap Heap Scan on mytable (cost=12.04..1632.35 rows=425 width=321)
Recheck Cond: (p_id = 543094)
-> Bitmap Index Scan on idx_mytable_p_id (cost=0.00..11.93 rows=425 width=0)
Index Cond: (p_id = 543094)
Run Code Online (Sandbox Code Playgroud)
问题:
记录有773行,p_id值为123456.有38列mytable.
谢谢!
我有以下代码,它将为我的结果创建一个逗号分隔列表:
DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+', ' ,'') + INSTITUTIONNAME
FROM EDUCATION
WHERE STUDENTNUMBER= '111'
SELECT @listStr
Run Code Online (Sandbox Code Playgroud)
问题在于它创建了一个大量逗号分隔的行.我需要它每行返回一个逗号分隔的列表.
所以,如果Simon已经成为2个机构的一部分,那么我希望:
"INSTITUTION1, INSTITUTION2"
Run Code Online (Sandbox Code Playgroud)
由于我没有提供where子句,我希望我的结果对于数据库中的每一行都显示如下.
当我尝试执行此代码段时:
cmd.CommandText = "SELECT alarm_id,definition_description,element_id,
TO_CHAR (alarm_datetime, 'YYYY-MM-DD HH24:MI:SS'),severity,
problem_text,status FROM aircom.alarms
WHERE status = 1 and
TO_DATE (alarm_datetime,'DD.MM.YYYY HH24:MI:SS') > TO_DATE ('07.09.2008
09:43:00', 'DD.MM.YYYY HH24:MI:SS')
order
by ALARM_DATETIME desc";
Run Code Online (Sandbox Code Playgroud)
我明白了:
ORA-01861: literal does not match format string
Run Code Online (Sandbox Code Playgroud)
数据库连接没有问题,因为我可以执行基本的SQL命令.
这个陈述有什么问题?
我很好奇为什么PostgreSQL中的所有数据库都有一个public所有用户都可以访问的模式.我知道我可以撤销权限并将其授予一个用户,但为什么这不是默认值?
SQL语言中<>的含义:示例代码如下
SELECT ordid,
prodid,
qty
FROM item
WHERE prodid IN (SELECT prodid
FROM item
WHERE ordid = 605)
AND qty IN (SELECT qty
FROM item
WHERE ordid = 605)
AND ordid <> 605;
Run Code Online (Sandbox Code Playgroud) 有没有更短的方法来寻找多个匹配:
SELECT *
from table
WHERE column LIKE "AAA%"
OR column LIKE "BBB%"
OR column LIKE "CCC%"
Run Code Online (Sandbox Code Playgroud)
这个问题适用于PostgreSQL 9.1,但如果有一个通用的解决方案,它会更好.
正如标题所说,有一种简单的方法可以在Java中向控制台输出两列吗?
我知道\t,但在使用printf时,我还没有找到基于特定列的空间方法.
postgresql ×5
sql ×3
oracle ×2
batch-file ×1
java ×1
newline ×1
ora-01861 ×1
oracle10g ×1
sql-server ×1
t-sql ×1
triggers ×1