如何用sql,复制一个数据库?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用sql,复制一个数据库?相关的知识,希望对你有一定的参考价值。

请问如何用sql语句,复制一个数据库?

SQL六种数据移动方法
1. 通过工具DTS的设计器进行导入或导出
DTS的设计器功能强大,支持多任务,也是可视化界面,容易操作,但知道的人一般不多,如果只是进行SQL Server数据库中部分表的移动,用这种方法最好,当然,也可以进行全部表的移动。在SQL Server Enterprise Manager中,展开服务器左边的+,选择数据库,右击,选择All tasks/Import Data...(或All tasks/Export Data...),进入向导模式,按提示一步一步走就行了,里面分得很细,可以灵活的在不同数据源之间复制数据,很方便的。而且可以另存成DTS包,如果以后还有相同的复制任务,直接运行DTS包就行,省时省力。也可以直接打开DTS设计器,方法是展开服务器名称下面的Data Transformation Services,选Local Packages,在右边的窗口中右击,选New Package,就打开了DTS设计器。值得注意的是:如果源数据库要拷贝的表有外键,注意移动的顺序,有时要分批移动,否则外键主键,索引可能丢失,移动的时候选项旁边的提示说的很明白,或者一次性的复制到目标数据库中,再重新建立外键,主键,索引。
其实建立数据库时,建立外键,主键,索引的文件应该和建表文件分开,而且用的数据文件也分开,并分别放在不同的驱动器上,有利于数据库的优化。
2. 利用Bcp工具
这种工具虽然在SQL Server7的版本中不推荐使用,但许多数据库管理员仍很喜欢用它,尤其是用过SQL Server早期版本的人。Bcp有局限性,首先它的界面不是图形化的,其次它只是在SQL Server的表(视图)与文本文件之间进行复制,但它的优点是性能好,开销小,占用内存少,速度快。有兴趣的朋友可以查参考手册。
3. 利用备份和恢复
先对源数据库进行完全备份,备份到一个设备(device)上,然后把备份文件复制到目的服务器上(恢复的速度快),进行数据库的恢复操作,在恢复的数据库名中填上源数据库的名字(名字必须相同),选择强制型恢复(可以覆盖以前数据库的选项),在选择从设备中进行恢复,浏览时选中备份的文件就行了。这种方法可以完全恢复数据库,包括外键,主键,索引。
4. 直接拷贝数据文件
把数据库的数据文件(*.mdf)和日志文件(*.ldf)都拷贝到目的服务器,在SQL Server Query Analyzer中用语句进行恢复:
EXEC sp_attach_db @dbname = 'test ',
@filename1 = 'd:\mssql7\data\test_data.mdf ',
@filename2 = 'd:\mssql7\data\test_log.ldf '
这样就把test数据库附加到SQL Server中,可以照常使用。如果不想用原来的日志文件,可以用如下的命令:
EXEC sp_detach_db @dbname = 'test '
EXEC sp_attach_single_file_db @dbname = 'test ',
@physname = 'd:\mssql7\data\test_data.mdf '
这个语句的作用是仅仅加载数据文件,日志文件可以由SQL Server数据库自动添加,但是原来的日志文件中记录的数据就丢失了。
5. 在应用程序中定制
可以在应用程序(PB、VB)中执行自己编写的程序,也可以在Query Analyzer中执行,这种方法比较灵活,其实是利用一个平台连接到数据库,在平台中用的主要时SQL语句,这种方法对数据库的影响小,但是如果用到远程链接服务器,要求网络之间的传输性能好,一般有两种语句:
1> select ... into new_tablename where ...
2> insert (into) old_tablename select ... from ... where ...
区别是前者把数据插入一个新表(先建立表,再插入数据),后者是把数据插入已经存在的一个表中,我个人喜欢后者,因为在编程的结构上,应用的范围上,第二条语句强于前者。
6. SQL Server的复制功能
SQL Server提供了强大的数据复制功能,也是最不易掌握的,具体应用请参考相关资料,值得注意的是要想成功进行数据的复制工作,有些条件是必不可少的:
1> SQL Server Agent必须启动,MSDTC必须启动。
2> 所有要复制的表必须有主键。
3> 如果表中有text或image数据类型,必须使用with log选项,不能使用with no_log选项。
另外max text repl size选项控制可以复制的文本和图像数据的最大规模,超过这个限制的操作将失败。
4> 在要进行复制的计算机上,应该至少是隐含共享,即共享名是C$或D$…。
5> 为SQL Server代理使用的Windows NT帐号不能是一个本地的系统帐号,因为本地的系统帐号不允许网络存取。
6> 如果参与复制的服务器在另外的计算机域中,必须在这些域之间建立信任关系。
参考技术A 自认为不是高手
--------------------------------

--在master中创建student表
use master
go
create table student
(
id int IDENTITY (1,1),
name varchar(20),
age int
)

--插入2条测试数据
insert into student
select '周杰伦','100'
union
select '蔡依林','1000'

--查询数据
select * from student

--创建测试数据库
create database test

--复制插入到新的数据库test
--语句原型 select * into 数据库.dbo.新表名 from 要复制的表
--copyfromstudent这个表不需要创建由into自动创建
select * into test.dbo.copyfromstudent from master.dbo.student

--查询新表的数据
select * from test.dbo.copyfromstudent

--copyfromstudent和student的表结构数据都一样
参考技术B select * into 新表名 from 旧表名 参考技术C creat table 新表 as (select * from 旧表);
这样会新建一张表,并且把老表的所有数据导入新表。

操作列时如何用熊猫数据框处理“除以零”? [复制]

【中文标题】操作列时如何用熊猫数据框处理“除以零”? [复制]【英文标题】:How to deal with "divide by zero" with pandas dataframes when manipulating columns? [duplicate] 【发布时间】:2016-12-17 14:40:19 【问题描述】:

我正在使用数百个 pandas 数据框。一个典型的dataframe如下:

import pandas as pd
import numpy as np
data = 'filename.csv'
df = pd.DataFrame(data)
df 

        one       two     three  four   five
a  0.469112 -0.282863 -1.509059  bar   True
b  0.932424  1.224234  7.823421  bar  False
c -1.135632  1.212112 -0.173215  bar  False
d  0.232424  2.342112  0.982342  unbar True
e  0.119209 -1.044236 -0.861849  bar   True
f -2.104569 -0.494929  1.071804  bar  False
....

在某些操作中,我在列值之间进行划分,例如

df['one']/df['two'] 

但是,有时我会被零除,或者两者兼而有之

df['one'] = 0
df['two'] = 0

自然会输出错误:

ZeroDivisionError: division by zero

我希望 0/0 实际上意味着“这里什么都没有”,因为这通常是数据帧中这样一个零的含义。

(a) 我如何将其编码为“除以零”为 0?

(b) 如果遇到被零除,我将如何将其编码为“通过”?

【问题讨论】:

我无法写出答案,因为这已被标记为重复 (?) 但如果您只有一列为零的选项是这样做的:1 / (df.ColumnWithZeros / df.ColumnWithoutZeros) 这在数学上是等效的。就像 1 / (2 / 3) 等价于 3 / 2 df['one'].div(df['two']).replace(np.inf, 0) 相关:Handling division by zero in Pandas calculations 【参考方案1】:

需要考虑的两种方法:

通过显式编码“无数据”值并对其进行测试,准备好您的数据,以免出现被零除的情况。

使用try/except 对包装每个可能导致错误的除法,如https://wiki.python.org/moin/HandlingExceptions 所述(其中有一个除以零的示例可供使用)

(x,y) = (5,0)
try:
  z = x/y
except ZeroDivisionError:
  print "divide by zero"

我担心您的数据中包含的零实际上是零(而不是缺失值)。

【讨论】:

Pandas(或 NumPy)不会引发 ZeroDivisionError。 @ayhan 我在使用 pandas div 函数时遇到了 ZeroDivisionError。文件“processing.py”,第 50 行,有趣 || df['pct'] = df['diffs', '2019-11-13'].divide(df['shares_latest']) ||文件“pandas/core/ops/__init__.py”,第 570 行,在 flex_wrapper || return self._binop(other, op, level=level, fill_value=fill_value) || _binop || 中的文件“pandas/core/series.py”,第 2618 行结果 = func(this_vals, other_vals) || ZeroDivisionError:浮点除以零【参考方案2】:
df['one'].divide(df['two'])

代码:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(5,2), columns=list('ab'))
df.loc[[1,3], 'b'] = 0
print(df)

print(df['a'].divide(df['b']))

结果:

    a           b
0   0.517925    0.305973
1   0.900899    0.000000
2   0.414219    0.781512
3   0.516072    0.000000
4   0.841636    0.166157

0    1.692717
1         inf
2    0.530023
3         inf
4    5.065297
dtype: float64

【讨论】:

这个答案似乎没有回答这个问题。解决方案是使用:df['one'].div(df['two']).replace(np.inf, 0).【参考方案3】:

使用分母中实际上为零的数据框可能会更有用(请参阅two 列的最后一行)。

        one       two     three   four   five
a  0.469112 -0.282863 -1.509059    bar   True
b  0.932424  1.224234  7.823421    bar  False
c -1.135632  1.212112 -0.173215    bar  False
d  0.232424  2.342112  0.982342  unbar   True
e  0.119209 -1.044236 -0.861849    bar   True
f -2.104569  0.000000  1.071804    bar  False

>>> df.one / df.two
a   -1.658442
b    0.761639
c   -0.936904
d    0.099237
e   -0.114159
f        -inf  # <<< Note division by zero
dtype: float64

当其中一个值为零时,您应该在结果中得到inf-inf。转换这些值的一种方法如下:

df['result'] = df.one.div(df.two)

df.loc[~np.isfinite(df['result']), 'result'] = np.nan  # Or = 0 per part a) of question.
# or df.loc[np.isinf(df['result']), ...

>>> df
        one       two     three   four   five    result
a  0.469112 -0.282863 -1.509059    bar   True -1.658442
b  0.932424  1.224234  7.823421    bar  False  0.761639
c -1.135632  1.212112 -0.173215    bar  False -0.936904
d  0.232424  2.342112  0.982342  unbar   True  0.099237
e  0.119209 -1.044236 -0.861849    bar   True -0.114159
f -2.104569  0.000000  1.071804    bar  False       NaN

【讨论】:

感谢您的解释; 'NaN' 插补非常有用。以后我会改进我的问题 我不认为这解决了关于 ZeroDivisionError 的问题。当我除以零时,我没有得到“inf”。我得到 ZeroDivisionError。【参考方案4】:

你总是可以使用 try 语句:

try:
  z = var1/var2
except ZeroDivisionError:
  print ("0") #As python-3's rule is: Parentheses

或者...

你也可以这样做:

if var1==0:
    if var2==0:
        print("0")
else:
    var3 = var1/var2

希望这有帮助!选择您想要的任何选择(无论如何它们都是相同的)。

【讨论】:

if ((var1==0) &amp;&amp; (var2==0)):【参考方案5】:

试试这个:

df['one']/(df['two'] +.000000001)

【讨论】:

如果df['two'] == -0.000000001怎么办? 这是一个可怕的答案;例如,如果分子不为零,这可能是任何东西 这没用。除了当数据恰好是 -1e-09 时,你会得到一个除以零的事实,根本不回答这个问题。 OP 已要求对分母中的 0 进行显式处理以输出 0 或其他一些缺失的数据标记值,例如南 请删除此答案。只需在分母上添加一个小数就意味着您移动到已经涵盖的无穷大...

以上是关于如何用sql,复制一个数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何用sql语句实现从服务器上MySQL数据库导

如何用post提交SQL数据?

如何用SQL语句查询两张表中的相同字段数据

请问 如何用SQL快速清空Magento产品和产品目录?

Myeclipse 如何用java 写sqlserver 的批量插入?

如何用标准SQL语句给一张表中添加多个字段