小编Eva*_*oll的帖子

任意排序表中的记录

使用数据库时的一个常见需求是按顺序访问记录。例如,如果我有一个博客,我希望能够以任意顺序重新排列我的博客文章。这些条目通常有很多关系,因此关系数据库似乎很有意义。

我见过的常见解决方案是添加一个整数列order

CREATE TABLE AS your_table (id, title, sort_order)
AS VALUES
  (0, 'Lorem ipsum',   3),
  (1, 'Dolor sit',     2),
  (2, 'Amet, consect', 0),
  (3, 'Elit fusce',    1);
Run Code Online (Sandbox Code Playgroud)

然后,我们可以对行进行排序order以使它们按正确的顺序排列。

然而,这似乎很笨拙:

  • 如果我想将记录 0 移到开头,我必须对每条记录重新排序
  • 如果我想在中间插入一条新记录,我必须在它之后重新排列每条记录
  • 如果我想删除一条记录,我必须在它之后对每条记录重新排序

很容易想象这样的情况:

  • 两条记录相同 order
  • order记录之间有间隙

由于多种原因,这些可能很容易发生。

这是 Joomla 等应用程序采用的方法:

Joomla 的订购方法示例

你可能会争辩说这里的界面很糟糕,他们应该使用箭头或拖放而不是人类直接编辑数字——你可能是对的。但在幕后,同样的事情正在发生。

有些人建议使用小数来存储订单,这样你就可以使用“2.5”在订单 2 和 3 的记录之间插入一条记录。虽然这有点帮助,但可以说它更混乱,因为你最终可能会得到奇怪的小数(你在哪里停?2.75?2.875?2.8125?)

有没有更好的方法将订单存储在表中?

database-design order-by database-agnostic relational-theory

32
推荐指数
3
解决办法
9346
查看次数

INT(5) vs SMALLINT(5):数字类型后括号中的数字

在 MySQL 表定义中,INT(5)和之间有区别SMALLINT(5)吗?或者它们都代表相同的大小?

mysql datatypes

31
推荐指数
1
解决办法
6万
查看次数

SQL Server 是否支持 GREATEST 和 LEAST,如果不支持,常见的解决方法是什么?

回顾这个问题,似乎不需要做很多工作。他们试图用日期扩展范围。在其他数据库中,您只需使用greatestleast..

least(extendDate,min), greatest(extendDate,max)
Run Code Online (Sandbox Code Playgroud)

当我尝试使用这些时,我得到

'least' is not a recognized built-in function name.
'greatest' is not a recognized built-in function name.
Run Code Online (Sandbox Code Playgroud)

这将涵盖任一方向的扩展。

就问题而言,您仍然需要进行排他性范围替换。

我只是想知道 SQL Server 用户如何实现查询模式来模仿leastgreatest功能。

您是否将条件展开到CASE语句中,或者是否存在启用此功能的 Microsoft 的扩展、第三方加载项或许可?

sql-server feature-comparison t-sql

30
推荐指数
6
解决办法
5万
查看次数

哪里可以找到第一个 SQL 标准化 SQL-86?

这个问题是不同的,但类似于这个寻找 SQL-89 的请求。

SQL 的初稿被标记为 SQL-86。对其进行了大量引用。这个可以下载吗?维基百科甚至没有一个页面。由于历史原因,我对它感兴趣。

好像也叫

  • ANSI X3.135-1986
  • CAN/CSA Z243.47-88
  • ISO 9075:1987
  • SQL/1
  • 国家统计局 FIPS 127

该规范在该时期的文件中被引用为来自ANSI 技术委员会 X3H2

我知道有 webstore.ansi.org,但我找不到该X3.135-1986文件。但是,我可以X3.168-1989X3.135-1992Searching for找到可用的规格both X3.168,并且X3.135不允许我购买 1986 规格。

sql-standard

28
推荐指数
4
解决办法
2222
查看次数

`ERROR 1114 (HY000) the table ... is full` innodb_file_per_table 设置为 autoextend

我有一个 MySQL 数据库,其中包含大量数据(100-200GB - 一堆科学测量值)。绝大多数数据存储在一张表中Sample。现在我正在创建数据库的从属副本,我想innodb_file_per_table在此过程中利用它的优势。所以我设置innodb_file_per_table了我的从属配置并导入了数据库的转储。令我惊讶的是,它失败了

第 5602 行的 ERROR 1114 (HY000):表 'Sample' 已满

该文件Sample.ibd目前约为 93GB,分区上有超过 600GB 的可用空间,因此这不是磁盘可用空间问题。它似乎没有达到任何类型的文件系统限制(我使用的是 ext4)。

对于可能是什么原因或要调查什么的任何想法,我将不胜感激。


更新:我正在使用mysql Ver 14.14 Distrib 5.1.66, for debian-linux-gnu (x86_64).

SELECT @@datadir; -- returns `/home/var/lib/mysql/`
SHOW VARIABLES LIKE '%innodb_data_file_path%'; -- ibdata1:10M:autoextend 

df -h /home/var/lib/mysql/
768G   31G  699G   5% /home
Run Code Online (Sandbox Code Playgroud)

mysql innodb mysql-5.1

27
推荐指数
1
解决办法
8万
查看次数

SQL Server 返回“将表达式转换为 int 数据类型时出现算术溢出错误”。

当我运行此命令时 SUM()

SELECT COUNT(*) AS [Records], SUM(t.Amount) AS [Total]
FROM   dbo.t1 AS t
WHERE  t.Id > 0
       AND t.Id < 101;
Run Code Online (Sandbox Code Playgroud)

我越来越,

Arithmetic overflow error converting expression to data type int.
Run Code Online (Sandbox Code Playgroud)

关于它的原因是什么的任何想法?

我只是按照这个答案中的说明进行操作。

sql-server aggregate datatypes sql-server-2017

27
推荐指数
2
解决办法
10万
查看次数

使用 PostgreSQL 8.4,如何在 postgres 中将 bytea 转换为文本值?

在我的应用程序中,我使用 C 代码在数据库中插入数据,因为我从不受信任的来源收到的字符串我已经使用PQescapeByteaConnlibpq 库对它们进行了转义。哪个工作得很好,即结果为八位字节格式字符串。看下面的例子,

输入字符串: \n\t\f\b\p\k\j\l\mestPrepared

输出字符串: \\012\\011\\014\\010pkjlmestPrepared

输出字符串被插入到数据库中。现在,我使用 JDBC 从 Java 代码中的数据库中检索该数据。如何将字符串转义回其原始值?

我想到了两种可能的方法,

  1. 更改数据库检索查询并将此字段传递给 postgres 的任何字符串操作函数,即可以将 bytea 转换为文本。
  2. 在Java代码中进行解码。

我可以理解方法 1 会更有效。我已经尝试了这里列出的几乎所有功能但没有任何效果。请帮忙!!

我在 linux 机器上使用 8.4 版的 postgres。

postgresql encoding postgresql-8.4 string bytea

25
推荐指数
3
解决办法
8万
查看次数

在 PostgreSQL 中,是否有类型安全的 first() 聚合函数?

完整问题重写

我正在寻找 First() 聚合函数。

在这里,我发现了一些几乎有效的东西:

CREATE OR REPLACE FUNCTION public.first_agg ( anyelement, anyelement )
RETURNS anyelement LANGUAGE sql IMMUTABLE STRICT AS $$
        SELECT $1;
$$;

-- And then wrap an aggregate around it
CREATE AGGREGATE public.first (
        sfunc    = public.first_agg,
        basetype = anyelement,
        stype    = anyelement
);
Run Code Online (Sandbox Code Playgroud)

问题是当 varchar(n) 列通过 first() 函数时,它会被转换为简单的 varchar(没有大小)。尝试在函数中将查询返回为 RETURNS SETOF anyelement,我收到以下错误:

错误:查询的结构与函数结果类型 Estado de SQL:42804 不匹配:返回的类型字符变化与第 2 列中的预期类型字符变化(40) 不匹配。上下文:PL/pgSQL 函数 vsr_table_at_time(anyelement,timestamp without time zone ) 第 31 行在 RETURN QUERY

在同一个 wiki 页面中,有一个指向该函数 …

postgresql aggregate functions greatest-n-per-group

25
推荐指数
3
解决办法
3万
查看次数

在 MySQL 5.5 中不能将日期默认为 CURRENT_TIMESTAMP

我无法设置Current_timestamp为默认值。我的Mysql版本是5.5.47.

查询是

ALTER TABLE `downloads` ADD `date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ;
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

虽然它在我的本地数据库上使用mysql V5.6.56.

timestamp default-value mysql-5.5 date

24
推荐指数
2
解决办法
17万
查看次数

如何在 PostgreSQL 8.4 中安装 pgcrypto?

我正在使用 Ubuntu Server 10.10 并且我已经使用apt-get install postgresql. 我想使用内置sha1()功能,但似乎必须先安装pgcrypto。但我不知道如何安装它。

没有pgcrypto,如果我尝试使用安装它apt-get install pgcrypto,我不找到以任何文件pgcrypto在我的系统(我想find / -name "pgcrypto*")。

如何安装 pgcrypto 以便我可以digest('word-to-hash','sha1')在我的数据库查询中使用该函数?


更新:我正在努力在另一台 Ubuntu 机器上安装 pgcrypto。使用sudo apt-get install postgresql-contrib-8.4如何将软件包安装到我当前的 PostgreSQL 数据库后安装软件包?

postgresql pgcrypto installation postgresql-8.4

23
推荐指数
2
解决办法
6万
查看次数