如何在sql server中创建一个像其他表一样的表?

时间:2016-11-11 08:43:34

标签: sql-server inheritance sql-like

我想在SQL Server中创建一个像另一个表的表。

在Postgres中我曾经用这个请求创建它:

CREATE TABLE IF NOT EXISTS table2 (LIKE table1  INCLUDING ALL) INHERITS (table1)

4 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

IF OBJECT_ID('table1', 'U') IS NULL BEGIN
   SELECT TOP 0 * INTO table1 FROM table2
END

这将在table2中克隆table1的列定义而不插入任何数据(因为top 0)。

然后你必须为table1创建PK,UK,FK。为此,您可以查看:https://www.mssqltips.com/sqlservertip/3443/script-all-primary-keys-unique-constraints-and-foreign-keys-in-a-sql-server-database-using-tsql/

使用此资源,您可以生成ALTER TABLE脚本,将所有PK,UK,FK添加到变量中并运行它:

DECLARE @sqlCommand nvarchar(1000)
EXECUTE sp_executesql @sqlCommand

答案 1 :(得分:1)

SELECT *    
INTO table2
FROM table1 where 1=2
  • SELECT * =选择所有列
  • INTO =设置地点
  • FROM =查找的地方,
  • WHERE 1=2 =过滤条件

答案 2 :(得分:0)

尝试

public function InsertarPropiedad($CadenaJson) {
    $ObjetoJson = json_decode($CadenaJson);
    $response   = array("Msg"=>"","IdRegistro"=>"0"); 
    try
    { 
        $stmt = $this->db->prepare("INSERT INTO PROPIEDADES (prop_id,titulo,propiedad,categoria,superficie,fecha,actualizacion,edo_sync,_id) VALUES(:PROP_ID,:TITULO,:PROPIEDAD,:CATEGORIA,:SUPERFICIE,:FECHA,:ACTUALIZACION,:EDO_SYNC.:ID)");
        $stmt->bindparam(":PROP_ID",$ObjetoJson->prop_id);
        $stmt->bindparam(":TITULO",$ObjetoJson->titulo);
        $stmt->bindparam(":PROPIEDAD",$ObjetoJson->propiedad);
        $stmt->bindparam(":CATEGORIA",$ObjetoJson->categoria);
        $stmt->bindparam(":SUPERFICIE",$ObjetoJson->superficie);
        $stmt->bindparam(":FECHA",$ObjetoJson->fecha);
        $stmt->bindparam(":ACTUALIZACION",$ObjetoJson->actualizacion);
        $stmt->bindparam(":EDO_SYNC",$ObjetoJson->edo_sync);
        $stmt->bindparam(":ID",$ObjetoJson->_id);

        $stmt->execute();

        $response["Msg"] = "Propiedad Registrado Correctamente";
        $response["IdRegistro"] = $this->db->lastInsertId(); 
    }
    catch(PDOException $e)
    {
        $response["Msg"]       = $e->getMessage();
        $response["IdRegistro"] = "0"; 
    }
    return json_encode($response);
}

并且,如果您希望表格为空,那么

SELECT *    
INTO table2
FROM table1

另一种选择是将TRUNCATE table2 编写为create,然后编辑脚本以创建table1

首选脚本选项,因为它还会保留所有索引,键等。您需要确保重命名索引以及表。

答案 3 :(得分:-1)

select top 0 * into x from y

将为您提供一个表空的shell,没有完全定义为原始表的数据减去所有索引,约束等