小编Man*_*ngo的帖子

PostgreSQL:生成的列

PostgreSQL 是否支持生成的列?也称为虚拟列。我不是在谈论IDENTITY

我找不到有关此卓越功能的任何信息,但我知道它在 SQL Server 以及最新版本的 MariaDB 和 MySQL 中可用。

SQL:2003标准中提到了该功能,并且在 2006 年左右在 PostgreSQL 论坛上进行了一些讨论,但我找不到关于此事的任何实质性内容。

有一些关于 SO 的讨论,但它现在已经很老了,所以它很可能已经过时了。

postgresql computed-column

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

PostgreSQL 替代 SQL Server 的 `try_cast` 函数

Microsoft SQL Server 有一个我认为非常明智的函数,如果转换不成功,try_cast()它返回一个null,而不是引发错误。

这使得可以使用CASE表达式或 acoalesce来回退。例如:

SELECT coalesce(try_cast(data as int),0);
Run Code Online (Sandbox Code Playgroud)

问题是,PostgreSQL 有没有类似的东西?

提出这个问题是为了填补我知识中的一些空白,但也有一个一般原则,即有些人更喜欢对某些用户错误做出不那么剧烈的反应。null在 SQL 中返回 a比错误更容易。例如SELECT * FROM data WHERE try_cast(value) IS NOT NULL;。根据我的经验,如果有 B 计划,有时可以更好地处理用户错误。

postgresql datatypes error-handling cast

13
推荐指数
2
解决办法
1万
查看次数

第一范式:明确定义

我试图获得什么是第一范式的明确版本。我阅读的所有内容都略有不同。

许多权威,例如 Date,说根据定义,关系总是处于第一范式,而其他人则给出了要求列表。这意味着对 1NF 的要求从零到很多。

我想区别在于表和关系之间的区别:表可能是一团糟,而关系遵循某些限制。关系在 SQL 中表示为表的事实因此造成了一些混淆。

我特别关注 1NF,因为它与 SQL 数据库有关。问题是:需要什么属性来确保表处于第一范式?


许多权威建议,如果一个表代表一个关系,那么它已经在 1NF 中。这将 1NF 的定义推回到关系的定义。

以下是 1NF 中表的一些属性:

  • 列顺序无关紧要 [1]
  • 行顺序无关紧要
  • 所有行的长度相同(即行数据与列标题匹配)
  • 没有重复的行(这可以使用代理主键来保证,但 PK 本身不是必需的)
  • 没有重复的列
  • 每一列包含一个单一值(原子)

[1] 技术上属性是无序的,但在表格中,行数据必须与列标题的顺序相同。然而,实际的顺序是微不足道的。

多个数据上

原子数据的概念是一个项目不能被进一步分解。这个概念是有限制的,因为虽然从技术上讲,一切都可以令人厌烦地分解,但实际上不能进一步分解所讨论的数据,这取决于数据的使用方式。

例如,完整地址或全名通常应该进一步细分,但可能不应该进一步细分诸如给定名称或城镇名称之类的组件,尽管它们可以作为字符串。

至于重复的列,它是一个设计不良列具有重复列,例如phone1phone2等。通常,重复数据指示用于一个附加的相关表的需要。

依赖

行之间不应该有任何关系,除了它们符合相同的标题。

列之间也应该没有关系,但我相信这是更高范式的主题。

问题是:1NF 的定义中有多少上述内容?独立行位也进入了吗?

normalization database-design relational-theory

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

SQL Server:用通配符替换?

Microsoft SQL Server 本身是否支持replace使用通配符的某种功能?我认为正则表达式本身不可用。

我注意到有一个PATINDEX函数可以用来将一个解决方案组合在一起——有没有更简单的方法?

例如REPLACE(data,'[xy]','q'),以取代xyq

sql-server t-sql pattern-matching replace

10
推荐指数
1
解决办法
7万
查看次数

是否有便携式 MySQL

出于教学和测试目的,我想运行 MySQL 而无需实际安装它。

我已经为 Macintosh 和 Windows 找到了可移植的 PostgreSQL,这很好,但是在 mySQL 中找不到相同的。

我知道我可以从流行的 Web 服务器包(例如 AMPPS 和 XAMPP)运行 MySQL,但它们无论如何都需要安装,并且超出了我的要求。

是否有适用于 OS X 和 Windows 的便携式应用程序可以完成这项工作?

谢谢

mysql windows mac-os-x

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

SQLite:指定数据类型有什么用?

据我所知,SQLite 不强制定义表数据类型——它具有动态类型。例如,它允许您将字符串插入到数字字段中,或超出字符串的长度。

如果是这样,那么在CREATE TABLE语句中定义数据类型有什么意义?

sqlite datatypes

8
推荐指数
2
解决办法
2633
查看次数

什么时候主键才有意义?

请原谅这里任何定义的松散,但我试图探索一个简单的概念。

一个主键唯一标识一行。表中可能还有其他列具有唯一值,因此它们也可以唯一标识一行(候选键),但主键是为任务指定的。

使主键更有用的属性包括:

  • 保证是唯一的;随着表的增长,其他一些唯一的列值可能会重复
  • 不太可能改变;虽然外键约束可以包括级联,但最好不要要求这个
  • 不会被回收;由于某种原因被删除的行不应释放旧的 PK 值以供重用

由于这些原因,我通常建议主键没有内在价值,因此永远没有理由更改或回收值。也就是说,它应该是没有意义的

我见过包含某种代码的主键,例如基于名称的客户端代码。明显的问题是 (a) 如果客户端名称更改,那么 PK 也应该更改,以及 (b) 与具有相似名称的客户端发生冲突的风险太大。

半个例外是使用自动递增的数字,它具有序列号的次要含义。但是,它仍然很稳定。

问题是,在什么情况下,如果有的话,最好使用具有其他实际含义的主键?也就是说,PK应该是任意的,并且你通常可以通过序列号获得的建议有什么问题吗?

database-design primary-key candidate-key

7
推荐指数
1
解决办法
3370
查看次数

SQL:在数据中存储格式

我一直教导将格式化数据存储在表格中是不正确的。例子包括:

+----------------+----+
| 数据 | 好的 |
+----------------+----+
| 0370101234 | ? |
+----------------+----+
| 03 7010 1234 | |
+----------------+----+
| (03) 7010 1234 | |
+----------------+----+

(为什么不支持表格?!)

数据是一个澳大利亚电话号码,通常有 10 位数字,包括区号。

包括格式间距或字符会引入歧义,因此更难排序或搜索。

问题是:标准或关系理论中有没有涵盖这个问题的内容?

编辑

这不是关于电话号码的问题。我用应该以最简单的形式存储的数据说明了一个点,即使它是用格式化字符显示的。

其他示例包括$显然从未与货币值一起存储的符号,以及有其自身问题的千位分隔符。

normalization database-design

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

阻止 SQL Server 对结果进行排序?

我正在教一门课,我想向我的学生证明,如果没有明确的ORDER BY. 我观察到即使ORDER BY查询中不存在SQL Server 似乎也返回有序结果。这是一个问题,因为我担心我的学生会在这一点上感到困惑。

观察到的行为示例:

  • 默认情况下,数据似乎按主键顺序排列,即使主键是非集群的。
  • 如果我使用GROUP BY,结果集似乎按最后一列的顺序排列。
    例如GROUP BY this, that,以数据的顺序结束,这很奇怪,尤其是在没有索引的情况下。

我还没有在其他数据库(如 MySQL、PostgreSQL 和 SQLite)中观察到这种行为。SQL Server 是否有一些根本不同的地方,即使没有ORDER BY?

现在在我看来,在没有被询问的情况下对数据进行排序是一个额外的不必要步骤,会浪费处理时间。真的吗?

是否有某种全局设置可以禁用这种行为?有没有办法让 SQL Server 停止对数据进行排序?

这也使得向学生证明数据不是自动排序的变得更加困难。

谁能给我一个简单的演示脚本,显示结果从执行到执行的变化顺序?

sql-server order-by group-by nonclustered-index

6
推荐指数
3
解决办法
6487
查看次数

以数字作为字符串的排序顺序

出于演示目的,我有一个示例表,其中有一varchar列名为numberstring以下值:

-4
32
0
4
16
8
-8
1024
Run Code Online (Sandbox Code Playgroud)

当选择使用时ORDER BY numberstring,我发现不同的用户得到不同的结果。

有些得到:

-4, -8, 0, 1024, 16, 32, 4, 8
Run Code Online (Sandbox Code Playgroud)

而有些人得到:

0, 1024, 16, 32, -4, 4, -8, 8
Run Code Online (Sandbox Code Playgroud)

不知何故,第二个结果似乎忽略了减号,即使数据以其他方式排序为字符串数据。

据我所知,底层服务器是 Microsoft SQL Server Express 的标准安装,没有任何特殊选项。该版本是最近几年的版本,但使用相同版本的用户仍然报告不同的结果。

设置中是否有某些内容会影响结果,我如何从 SSMS 中查看它?

据我所知,数据库服务器和 SSMS 在澳大利亚设置,仅使用默认设置。数据类型是varchar(max).

sql-server collation

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