标签: create-table

在创建表时在SQL中对列进行排序的最佳实践

我有一个表foo,其中包含以下列

create table foo (
id integer not null auto_increment unique,
name varchar(255),
desc varchar(255),
modified_time datetime not null,
type tinyint(1)
)
Run Code Online (Sandbox Code Playgroud)

是否有遵循所有列的排序约定的最佳实践(例如,按字母方式或顶部不为空,底部为其余列)

mysql sql create-table

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

创建数据库 - 如何找到默认数据目录?

我希望能够使用我在这里找到的代码在我的C#WinForm应用程序中创建一个数据库.

但我需要找到一种方法来获取该特定SQL Server实例的默认数据目录.我想知道是否有一种简单的方法来实现这一点,可以在各种版本的SQL Server上使用.

提前致谢.


编辑

我发现以下Select将返回远程服务器上的默认数据目录:

SELECT 
    SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
FROM master.sys.master_files 
WHERE database_id = 1 
    AND file_id = 1
Run Code Online (Sandbox Code Playgroud)

此解决方案仅适用于SQL Server 2005+.

**

c# sql-server create-table

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

SQL:错误1005:无法创建表'obl2.itemsubjects'(错误号:121)

我有以下表格:

CREATE  TABLE `OBL2`.`item` (
`itemID` INT NOT NULL AUTO_INCREMENT ,
`itemName` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`itemID`) ,
INDEX `itemName` (`itemName` ASC) );

CREATE  TABLE `OBL2`.`subject` (
`subjectID` INT NOT NULL ,
`subjectName` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`subjectID`) );
Run Code Online (Sandbox Code Playgroud)

现在由于连接是多对多的,每个项目可以有很多主题,每个主题可以与许多项目相关 - 我想设置一个连接表.这是我的代码:

CREATE  TABLE `OBL2`.`itemsubjects` (
`itemID` INT NOT NULL ,
`subjectID` INT NOT NULL ,
PRIMARY KEY (`itemID`, `subjectID`) ,
INDEX `itemID_idx` (`itemID` ASC) ,
INDEX `subjectID_idx` (`subjectID` ASC) ,
CONSTRAINT `itemID`
FOREIGN KEY (`itemID` …
Run Code Online (Sandbox Code Playgroud)

mysql sql database-design create-table

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

具有 5 个表的复杂 SQL 联接

我正在开发一个相对庞大的应用程序,其中包含相当多的表。我必须编写一个 SQL 查询,它在简化后涉及 5 个表(有关连接,请参见 jpg)。

想法如下:人有地址,地址有类型(私人、专业等)和国家。人也可以有选择。这些选项(此处在带有 name_id 的选项表中说明)可以链接到地址类型。

这个想法是提取所有拥有一个或多个地址的人,这些地址由一个国家指定,并且他们也出现在 [option address] 表中。

例如,假设我们想要地址为 country_id=1 的人。结果集必须排除与其选项链接的地址类型不同的人员。

嗯...我不确定我是否了解自己 :)

但无论如何,这是创建所有内容的 SQL。

CREATE TABLE `address` (
  `person_id` int(11) NOT NULL,
  `type_id` int(11) NOT NULL,
  `country_id` int(11) NOT NULL,
  UNIQUE KEY `apt` (`person_id`,`type_id`),
  KEY `apid` (`person_id`),
  KEY `atid` (`type_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `address` (`person_id`, `type_id`, `country_id`) VALUES
(1, 1, 1),
(2, 2, 1),
(3, 1, 1),
(3, 2, 2),
(5, 1, 2),
(6, 2, 1),
(7, 1, 1),
(7, 2, …
Run Code Online (Sandbox Code Playgroud)

sql join create-table

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

使用循环引用SQL在TABLES中INSERT

我有2张桌子:

Empleados(**numEmpl**, nombre, apellido, sexo, telefono, salario, numDept)
Departamentos(**numDept**, nombreDept, numDirect)
Run Code Online (Sandbox Code Playgroud)

在出发中:

  1. numEmpl是主键
  2. numDept是Departamentos(numDept)的外键引用.在出发中:
  3. numDept是主键
  4. numDirect是Empleados的外键引用(numEmpl)

所以有一个循环引用.

首先我创建了表:

CREATE TABLE EMPLEADOS(numEmpl primary key, nombre, 
     apellido, sexo, telefono, salario, numDept)
CREATE TABLE DEPARTAMENTOS(numDept primary key, nombreDept, numDirect)
(i didn't write here each of type is each colum)
Run Code Online (Sandbox Code Playgroud)

现在我在它们之间创建引用:

ALTER TABLE DEPARTAMENTOS 
    ADD CONSTRAINT FK_DEPT_EMP FOREIGN KEY (numDirect) 
    REFERENCES EMPLEADOS(numEmpl)
ALTER TABLE EMPLEADOS 
    ADD CONSTRAINT FK_EMP_DEPT FOREIGN KEY (numDept) 
    REFERENCES DEPARTAMENTOS(numDept).
Run Code Online (Sandbox Code Playgroud)

它工作,所以现在我尝试插入一些数据:

INSERT INTO Empleados(numEmpl, nombre, apellidos, sexo, telefono, salario, numDept)
VALUES …
Run Code Online (Sandbox Code Playgroud)

sql create-table circular-reference sql-insert

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

“创建表为选择”不保留不为空

我正在尝试使用 Oracle 的“按选择创建表”功能进行快速更新。我看到的问题是“空”字段没有被保留。

我定义了下表:

create table mytable(
  accountname varchar2(40) not null,
  username varchar2(40)
 );
Run Code Online (Sandbox Code Playgroud)

当我执行原始 CTAS 时,帐户上的 NOT NULL 被保留:

 create table ctamytable as select * from mytable;

 describe ctamytable;

Name        Null     Type         
----------- -------- ------------ 
ACCOUNTNAME NOT NULL VARCHAR2(40)

USERNAME             VARCHAR2(40) 
Run Code Online (Sandbox Code Playgroud)

但是,当我对帐户名进行替换时,不会保留 NOT NULL。

 create table ctamytable as 
   select replace(accountname, 'foo', 'foo2') accountname, 
          username 
     from mytable;

 describe ctamytable;

Name        Null Type          
----------- ---- ------------- 
ACCOUNTNAME      VARCHAR2(160) 
USERNAME         VARCHAR2(40) 
Run Code Online (Sandbox Code Playgroud)

请注意,该accountname字段不再有空值,并且该varchar2字段从 40 个字符变为 160 个字符。有没有人见过这个?

oracle create-table

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

PostgreSQL-创建表格并设置特定的日期格式

我想创建一个新表并使用特定格式设置日期类型。那可能吗?

例如:

CREATE TABLE User (
... 
EXPIRATION DATE " YYYY/MM"
... 
)
Run Code Online (Sandbox Code Playgroud)

sql postgresql date date-format create-table

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

MySQL innodb - 外键:只有1号有效吗?

我有这个例子,不能创建customers_b.错误代码1005 /错误号:121.但是,如果我首先创建customers_b而不是customers_a,那么customers_a就是那个不会被创建的.

怎么了?为什么我不能将多个FK链接到PK'id_state'?谢谢!

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP SCHEMA IF EXISTS `testdb` ;
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `testdb` ;

-- -----------------------------------------------------
-- Table `testdb`.`state`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `testdb`.`state` ;

CREATE TABLE IF NOT EXISTS `testdb`.`state` (
`id_state` INT NOT NULL,
`abbr` CHAR(2) NOT NULL,
PRIMARY KEY (`id_state`),
UNIQUE INDEX `id_state_UNIQUE` (`id_state` ASC))
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `testdb`.`customers_a`
-- ----------------------------------------------------- …
Run Code Online (Sandbox Code Playgroud)

mysql create-table

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

为什么整数DEFAULT值会得到引号?

在MySQL 5.6.23上创建的简单测试表:

CREATE TABLE `test` (
  `tinyint` tinyint(1) NOT NULL DEFAULT 0,
  `int` int(11) NOT NULL DEFAULT 0
);
Run Code Online (Sandbox Code Playgroud)

注意如何DEFAULT写入值:字面意思0.一旦它被创建,我做:

SHOW CREATE TABLE `test`;
Run Code Online (Sandbox Code Playgroud)

得到:

CREATE TABLE `test` (
  `tinyint` tinyint(1) NOT NULL DEFAULT '0',
  `int` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

这些DEFAULT价值获得了报价:'0'!

为什么会这样?更重要的是,我应该一直用引号括起数字默认值吗?

mysql create-table

5
推荐指数
2
解决办法
741
查看次数

在PostgreSQL中创建一个自动增加的主键列

我正在按照CREATE TABLE 中的示例进行操作:

CREATE TABLE distributors (
     did    integer PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
     name   varchar(40) NOT NULL CHECK (name <> '')
);
Run Code Online (Sandbox Code Playgroud)

但是,它给了我ERROR: syntax error at or near "GENERATED"。为什么会这样,我该如何解决?

  • \! psql -V返回psql (PostgreSQL) 10.5 (Ubuntu 10.5-1.pgdg14.04+1)
  • SELECT version();在 x86_64-pc-linux-gnu (Ubuntu 9.4.19-1.pgdg14.04+1) 上返回PostgreSQL 9.4.19,由 gcc (Ubuntu 4.8.4-2ubuntu1~14.04.4) 4.8.4 编译,64 位

编辑:

感谢 @muistooshort,我检查了 9.4 文档。所以我执行:

CREATE TABLE distributors (
     did    integer PRIMARY KEY DEFAULT nextval('serial'),
     name   varchar(40) …
Run Code Online (Sandbox Code Playgroud)

postgresql create-table

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