SQL Server 有一个带有可选唯一列的怪癖:null一个表中不能有多个。
例如:
create table employees (
id int identity(1,1) primary key,
givenname nvarchar(24) not null,
familyname varchar(24) not null,
tfn char(9) unique -- optional, but unique
);
Run Code Online (Sandbox Code Playgroud)
(在澳大利亚,我们有一个纳税人独有的税号)。
以下是一种解决方法:
create table employees (
id int identity(1,1) primary key,
givenname nvarchar(24) not null,
familyname varchar(24) not null,
tfn char(9)
);
CREATE UNIQUE NONCLUSTERED INDEX uq_employees_tfn ON employees(tfn)
WHERE tfn IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
是否可以命名一个唯一的约束并给它上述条件是一种类似于第一个示例的方式?也就是说,是否可以在列定义中包含更复杂的约束?
我对关系 DBMS 非常熟悉,但对 Oracle 不熟悉。我在 Docker 内部运行 Oracle 18c XE(在 MacOS 上)。我使用第三方客户端(MacOS 上的 SQLPro Studio)连接到它。现在我想开始。
如果这是 MySQL,我可以发出CREATE DATABASE whatever; USE whatever;并继续处理这些表。与 Microsoft SQL Server 相同,与 PostgreSQL 类似。我还可以创建一个额外的模式来保持更好的组织。
我认为 Oracle XE 只为您提供一个数据库,我想创建一个合适的模式。此时我在海上。我认为我需要创建一个与模式关联的新用户。
我也知道不同的 RDBMS 对什么是数据库或模式有不同的想法,所以我不确定这是否是正确的定义或解决方案。
我在客户端中创建新用户或新架构都没有成功。
我试过了:
CREATE USER fred IDENTIFIED BY 'h3art0fg0ld`;
Run Code Online (Sandbox Code Playgroud)
但我收到消息:
无效的通用用户名或角色名
我还读到我应该使用类似的东西c##fred,它确实有效,但是 (a) 我真的不知道这意味着什么和 (b) 声明GRANT connect, resource, create sessions TO c##printsdb;给了我“缺少或无效特权”的消息,所以我没有进一步先。
在 Docker 容器中,我不知道我是否可以访问 SQL*Plus,这是一些在线教程所假定的。
如何创建和使用架构,或包含表集合所需的任何内容?
假设我有 2 个共享一些列名的表。在这种情况下,主键是两个都被调用id。
CREATE TABLE artists(
id int primary key,
name text,
-- …,
);
CREATE TABLE paintings(
id int primary key,
artistid references artists(id),
title text,
-- …,
);
Run Code Online (Sandbox Code Playgroud)
注意: 我知道有一些反对将主键称为通用名称id的论据,例如,但让我们假设,为了争论,它超出了我的控制范围。无论如何,就这个问题而言,它可能是任何其他列。
假设我现在有一个粗心编写的SELECT语句,它试图使用相关子查询从引用的表中提取数据:
SELECT
id, title,
(SELECT name FROM artists WHERE artistid=id) as artist
FROM paintings;
Run Code Online (Sandbox Code Playgroud)
显然,内部WHERE子句可以更好地写成WHERE paintings.artistid=artists.id. 但是我已经摆脱了它并且它有效。如果我将WHERE子句写为id=artistid.
我知道这不是最好的方法,但我更惊讶的是它理解了我的意图,这不是我们对 SQL 的期望。
问题是:SQL 如何解释相关子查询中的歧义列?
我知道这个表达:
WHERE column <> ALL(subquery)
Run Code Online (Sandbox Code Playgroud)
可以写成:
WHERE column NOT IN(subquery)
Run Code Online (Sandbox Code Playgroud)
什么是等价的
WHERE column = ALL(subquery)
Run Code Online (Sandbox Code Playgroud)
我认为支持ALL运算符的 SQL 方言之间不会有任何差异。
我有理由更改我的计算机名称(it\xe2\x80\x99s 在虚拟机中运行)。我有一个现有的 SQLExpress 实例,它是在重命名之前安装的。
\n有些功能会失败,因为新数据库仍然由旧所有者创建。更具体地说,当我尝试创建新的数据库图表时,出现以下错误。
\n\n\n无法获取有关 Windows NT 组/用户 \'OLDNAME\\user\' 的信息,错误代码 0x534。(微软 SQL Server,错误:15404)。
\n
我使用以下说明来重命名服务器:
\nsp_dropserver \'OLDNAME\\SQLEXPRESS\';\nGO\nsp_addserver \'NEWNAME\\SQLEXPRESS\',\'local\';\nGO\n-- Restart Server\nSELECT @@SERVERNAME; -- NEWNAME\\SQLEXPRESS\nRun Code Online (Sandbox Code Playgroud)\n但是,这并不影响新数据库的默认所有者。它们仍在与所有者一起创建OLDNAME\\user,但所有者已不存在。
我知道如何在创建后更改现有数据库的所有者。但是,如何才能让新数据库拥有正确的所有者呢?
\n我已经读到 Microsoft SQL Server 已弃用text数据类型而支持varchar(max).
PostGreSQL 已经允许varchar(没有长度)作为text.
问题是,ANSI SQL 标准对弃用text和最佳替代方案有何看法?另外,MySQL/MariaDB 是否也遵循这一点?
谢谢
如果我有一个使用类似的窗口函数
SELECT *, row_number() OVER (ORDER BY something) FROM table
Run Code Online (Sandbox Code Playgroud)
结果应该排序吗?
我目前正在 Microsoft SQL Server 中测试我的查询,它肯定是已排序的,但我知道该产品倾向于在未询问时对行进行排序。
这是标准行为吗?
我需要弄清楚这里的订单是什么意思。我只是询问获取数据的顺序。
如果我只是SELECT * FROM table;在没有ORDER BY子句的SQL Server 中,我发现结果总是以相同的顺序出现。对于其他一些数据库服务器,例如 PostgreSQL,情况肯定不是这样。
观察到的行为真的发生了吗?我认为结果将按照添加行的顺序返回。
我还没有尝试过使用非常大的表格,但我使用过的表格似乎确实如此。
笔记:
此问题仅与 SQL Server 相关。我非常理解 SQL 本身没有首选顺序,这是我使用其他数据库的经验。
关键是 SQL Server 似乎更喜欢分配顺序,我想知道这是否属实。
笔记2:
至于这个问题可能是重复的,我对为什么特别在任何地方添加行不感兴趣。我只是想知道它们是否按分配顺序正常返回......
sql-server ×4
docker ×1
logins ×1
mysql ×1
null ×1
oracle ×1
oracle-18c ×1
oracle-xe ×1
order-by ×1
owner ×1
postgresql ×1
schema ×1
select ×1
sql-standard ×1
subquery ×1
where ×1