小编ber*_*d_k的帖子

为什么主键有自己的名字?

从数学的角度来看,假设一个表最多有一个主键,通过任意名称而不是简单的表属性来引用主键似乎是一种短视的设计决定。

因此,要将主键从非集群更改为集群,反之亦然,您必须首先搜索其名称,而不是删除它并最终读取它。

使用我看不到的任意名称是否有一些优势,或者 DBMS 是否不使用任意名称作​​为主键?

编辑 2011-02-22 (对于那些不想在那里排序的人,2011 年 2 月 22 日):

让我展示一个函数,您可以使用它从表名中导出主键的名称(使用早期的 sql-sever 又名 sybase 系统表):

create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
    return (select k.name
    from sysobjects o 
        join sysobjects k   on k.parent_obj = o.id 
    where o.name = @tablename
    and o.type = 'U'
    and k.type = 'k')
end
go
Run Code Online (Sandbox Code Playgroud)

正如 gbn 所说,当您不提供明确的名称时,没有人真正喜欢生成的名称:

create table example_table (
    id int primary key
)

select dbo.get_pk('example_table')  
Run Code Online (Sandbox Code Playgroud)

我刚得到

PK__example___3213E83F527E2E1D
Run Code Online (Sandbox Code Playgroud)

但是为什么 sysobjects 中的名称必须是唯一的。对表及其主键使用完全相同的名称是完全可以的。

这样做,我们不需要设置命名约定,这可能会被意外违反。

现在回答玛丽安:

  1. 我仅使用将集群主键更改为非集群主键的任务作为示例,我需要知道 pk 的实际名称才能删除它。
  2. 事物不需要有专有名称,如果它们可以很容易地唯一表示就足够了。这就是抽象的基础。面向对象编程就是这样。您不需要为不同类的相似属性 …

primary-key

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

空字符串:为什么或何时 '' 等于 ' '?

谁能解释为什么

select case when '' = ' ' then 1 else 0 end, LEN(''), LEN(' '), DATALENGTH(''), DATALENGTH(' ');
Run Code Online (Sandbox Code Playgroud)

产量

----------- ----------- ----------- ----------- -----------
1           0           0           0           1
Run Code Online (Sandbox Code Playgroud)

有趣的结果是,在

create table test ( val varchar(10) );
insert into test values( '' );
update test set val = ' ' where val = '';
Run Code Online (Sandbox Code Playgroud)

更新确实会用空白替换空字符串,但 where 子句保持为真,并且重复执行更新语句告诉

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 empty-string

17
推荐指数
1
解决办法
6456
查看次数

在手写代码中使用 SQL Server 的括号表示法有意义吗?

当代码生成器使用新的 Microsoft 括号表示法 ( []) 为几乎所有内容生成输出时,它们往往更简单。

当我第一次看到它时,我虽然哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇当时有些禁止引用的标识符符号表示法被禁止引用的标识符符号的转世。

据我所知,它是 Microsoft 的专有扩展(意味着 Oracle 不支持它)。

查看 SQL Server,如果您定义一个表,则没有区别

CREATE TABLE [dbo].[Table_2] ([col1] [int], [col2] [int]);
Run Code Online (Sandbox Code Playgroud)

或者

CREATE TABLE dbo.Table_2 (col1 int, col2 int);
Run Code Online (Sandbox Code Playgroud)

这是个人或公司风格的问题。始终如一。

现在,如果您想将数据库迁移到 Oracle,括号是没有选择的。

您可以使用旧的带引号的标识符,但这些标识符区分大小写,这会导致很多麻烦。

从生成的代码中删除所有括号、避免使用空格、其他特殊字符和保留关键字作为名称,并且仅以大多数 DBMS 理解的方式进行编码是否是个好主意?

sql-server style t-sql

15
推荐指数
5
解决办法
1万
查看次数

为什么 SQL*PLUS 在 CREATE TYPE 后需要一个斜线?

我只是遇到了问题,我定义了一个类型并在 TOAD 中对其进行了测试,一切正常。但是在 SQL*PLUS 下运行它抛出了一个错误。

例子:

CREATE OR REPLACE TYPE MyType AS OBJECT (
    Item1 NUMBER,
    Item2 NUMBER
);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我必须在这里添加斜线

CREATE OR REPLACE TYPE MyType AS OBJECT (
    Item1 NUMBER,
    Item2 NUMBER
);
/
Run Code Online (Sandbox Code Playgroud)

对我来说,它看起来类似于不需要斜线的 Create Table 语句。我觉得比较混乱。我知道它是如何工作的,但谁能解释为什么做出这个设计决定?

oracle sqlplus user-defined-type

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

如何在 listener.ora 中配置没有 SID_LIST_LISTENER 的 Oracle 侦听器?

我可以使用以下 listener.ora 访问 ORACLE 11g 服务器

# listener.ora Network Configuration File: D:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN\listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.111.111)(PORT = 1521))
    )
  )
Run Code Online (Sandbox Code Playgroud)

它为该服务器上的所有实例提供服务,我可以通过以下方式验证

lsnrctl status
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我在虚拟机中全新安装 Oracle 11g 时,我必须使用 listener.ora 之类的

# listener.ora Network Configuration File: C:\app\oracle\product\11.2.0\dbhome_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:\app\oracle\product\11.2.0\dbhome_1)
      (PROGRAM = …
Run Code Online (Sandbox Code Playgroud)

oracle-11g listener

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

有没有人在实践中使用过 sqlcmd 模式?

SQLServer 2005 引入了称为SQLCMD 模式 msdn 链接的东西 。

乍一看,这种模式从命令行批处理文件中添加了变量替换,还有一些转义到操作系统命令。

此功能是否在您的环境、生产或测试中使用?

sql-server-2005 ssms sqlcmd

12
推荐指数
1
解决办法
1039
查看次数

是否有人使用 SQL Server 功能创建按数字区分的存储过程组?

该问题是指此msdn 文档中的 number 参数

如果不这样做,您可以在 SQL-Server 中创建多个按编号区分的存储过程,然后一键删除它们。

create procedure dbo.stored_proc1 as select 1
go
create procedure dbo.stored_proc1;2 as select 2
go
exec stored_proc1
-- returns 1
go
exec stored_proc1;2
-- returns 2
go
drop stored_proc1
-- drops both 
go
Run Code Online (Sandbox Code Playgroud)

我想知道这个功能是否被任何人用于有用的东西,或者它只是一个历史性的好奇心。

sql-server stored-procedures

11
推荐指数
2
解决办法
222
查看次数

如何为 SELECT 语句中的每一行分配不同的随机值?

请看这段代码:

create table #t1(
  id int identity (1,1),
  val varchar(10)
);


insert into #t1 values ('a');
insert into #t1 values ('b');
insert into #t1 values ('c');
insert into #t1 values ('d');
Run Code Online (Sandbox Code Playgroud)

现在,每当你执行这个

select *, 
    ( select top 1 val from #t1 order by NEWID()) rnd 
from #t1 order by 1;
Run Code Online (Sandbox Code Playgroud)

您将得到一个结果,其中所有行都具有相同的随机值。例如

id          val        rnd
----------- ---------- ----------
1           a          b
2           b          b
3           c          b
4           d          b
Run Code Online (Sandbox Code Playgroud)

我知道一种使用游标循环抛出行并获得不同随机值的方法,但这不是高效的。

一个聪明的解决方案是

select t1.id, t1.val, t2.val
from #t1 t1
    join (select …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server

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

不同字符集导致的Oracle导入问题

我正在尝试将 Oracle 11 导出导入 Oracle 11 XE。

我收到以下消息:

在 WE8MSWIN1252 字符集和 AL16UTF16 NCHAR 字符集中完成的 XE fehlerhaft 导入
导入服务器使用 AL32UTF8 字符集(可能的字符集转换)

任何想法,我如何将此转储导入 Oracle 11 XE ?

编辑:

给定一张桌子

CREATE TABLE BDATA.Artikel(
    Key                   VARCHAR2(3)  NOT NULL,
    Name                  VARCHAR2(60) NOT NULL,
    Abkuerzung            VARCHAR2(5)  NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

我收到这样的错误

IMP-00019: row rejected due to ORACLE error 12899
IMP-00003: ORACLE error 12899 encountered
ORA-12899: value too large for column "BDATA"."ARTIKEL"."ABKUERZUNG" (actual: 6, maximum: 5)
Column 1 ABL
Column 2 Aufbewahrungslösung
Column 3 AfbLö
Run Code Online (Sandbox Code Playgroud)

导入中缺少某些行。

oracle import

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

为什么我不能通过 SQL-SERVER 2008 链接服务器读取 Oracles CLOB 列?

我想从 SQL-Server 2008 访问 Oracle 11g 数据库中的数据

我设置了一个链接服务器,当我执行

select * from [Link_server_name]..Oracle_schema.Oracle_table
Run Code Online (Sandbox Code Playgroud)

和 Oracle_table 包含 Number 和 varchar2 列,所有工作都作为例外。

但是当 Oracle_table 包含一个 CLOB 列时,我收到以下错误:

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung 'Unspecified error' zurückgeben。

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung '发生 Oracle 错误,但无法从 Oracle 检索错误消息。祖鲁克本。

Der OLE DB-Anbieter 'MSDAORA' für den Verbindungsserver 'L_V407SR8T' hat die Meldung '不支持数据类型。' 祖鲁克本。

消息 7306,级别 16,状态 2,第 1 行

Die '"MCCAPP"."DOGGRUPPEN"'-Tabelle vom OLE DB-Anbieter 'MSDAORA' für …

sql-server-2008 oracle oracle-11g

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