如何对比两个数据库中的结构、表数量、字段数量等是否一致的问题

我今天说的是把两个不同的数据库mysql和Oracle,在做数据迁移的时候,想查看两个表有什么不同的地方,无论是表名也好、表的数量也好、表里的字段也好、数据类型也好,都可以比较的出来。

环境及工具:

1、mysql数据库

2、Oracle数据库

注:这两个数据库我都用的是Navicat Premium 12其他好像也可以,大差不差的软件都行

3、网段不同(意思就是说我的mysql网和Oracle用的网是不同的,在一个网段的更好,省事了。。。)

4、WPS工具和一个懂使用WPS的人(身为编程的我,死在了Excel上、、、)

进入正题,

首先你需要在mysql上打开你需要核实的库,执行如下SQL

select * from information_schema.columns

对于执行出来的数据,然后找这个按钮,如下:

找到“导出结果”,点击,然后

点击“导出当前的结果”,然后,如下:

上面这两个都行,但是等一下我们操作导出Oracle数据时最好保持一致,然后点击下一步

这不用管,下一步,然后你会看到如下:

不管,下一步,然后后看到如下:

然后,就可以等他导出完毕。就可以在桌面找到一个“无标题.xls”的文件,修改这个文件的名字,我修改成“mysql数据”,随便啦~

然后我们转到Oracle数据库,执行如下:

select * from user_tab_columns

还是这个软件,还是刚刚的步骤,再来一遍。然后我们就可以打开这两个文件了。

我们需要在这两个文件里的数据中挑出自己需要的东西,比方说表名,字段名,字段类型

Oracle的容易找,但是,mysql的不容易找。

你打比方如下:

Oracle的很好看,但是mysql的就不是那回事了,活生生的让我找了半天(捂心口)

然后,就好了,然后就将剩下的工作交给文职人员,或者更懂Excel文件的人来,他们更会弄,我也只学到了一个皮毛,可以分享一下,

打比方,

我要查询mysql数据库里有的表,而Oracle数据库里没有的表,或者说是,mysql有的字段,Oracle数据库里少字段的现象。

如下:我会先弄成这个样子

然后,我们需要如下:选中表名这一列,就是放到红色箭头指的地方就能选中一列,然后ctrl+C复制,如下这个样子

然后呢,我们需要右击找到“选择性粘贴”,如下:

点击后,看到如下并修改成红色箭头所指的目标:

即可,另外一个也是同样的道理。

等弄完了之后,我们需要返回到mysql的表上,找到一个空白的位置,如下:

输入:

=VLOOKUP()

然后点击A1的位置,如下:

然后,我们需要加一个逗号,然后点击另外一个Excel文件,然后再加一个逗号,再选中另外一个文件的表名的那一列,入下图:

然后,我们不需要再切回去,直接在这个文件中依次按下

,1,0

就像这样:

然后回车,这时会回弹到mysql的Excel表内,并多了一个东西

此时,我们需要如下操作,点击红色十字的位置:

让他成为下图的这个样子,并选中这一列(C列):

然后,如下,点击“自动筛选”:

然后点击这里:

然后,如下,取消掉所有的选项,只保留最后一个:

如果说,你没发现最后一项,那恭喜你,至少在表的名称上和字段的数量上是正确的

多列对比多列,对不起。没学会,你还是找个会Excel的人吧,告辞

完(写的不好,原谅色)

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
问题解答: 1. 使用三层结构来完成数据库操作,使用业务类来完成数据库books字段的更新操作。 在三层架构,我们可以将数据库操作分为三个层次:数据访问层(DAO)、业务逻辑层(Service)和示层(Presentation)。其,数据访问层用于与数据库交互,业务逻辑层用于完成业务逻辑的处理,示层用于与用户进行交互。 对于本题所述的需求,我们可以定义如下的业务类: ``` public class BookService { private BookDao bookDao = new BookDao(); public List<Book> getAllBooks() { return bookDao.getAllBooks(); } public void updateBook(Book book) { bookDao.updateBook(book); } } ``` 其,BookDao 是数据访问层,用于与数据库进行交互;BookService 是业务逻辑层,用于完成业务逻辑的处理。在上述代码,我们定义了两个方法:getAllBooks() 用于获取所有的书籍信息,updateBook(Book book) 用于更新书籍的库存数量和价格等信息。 2. 需要建立一个Servlet,用来以格的形式显示数据库book 的所有信息,同时提供超链接。 我们可以编写如下的 Servlet: ``` public class BookListServlet extends HttpServlet { private BookService bookService = new BookService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Book> bookList = bookService.getAllBooks(); req.setAttribute("bookList", bookList); req.getRequestDispatcher("/bookList.jsp").forward(req, resp); } } ``` 在上述代码,我们通过调用 BookService 的 getAllBooks() 方法来获取所有的书籍信息,并将其保存到 request 对象。然后,我们通过请求转发的方式将其传递给 bookList.jsp 页面进行显示。 在 bookList.jsp 页面,我们可以使用格的形式来显示所有的书籍信息,并提供超链接来跳转到修改页面。具体代码如下: ``` <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>图书列</title> </head> <body> <h1>图书列</h1> <table border="1"> <tr> <th>ISBN编号</th> <th>书名</th> <th>作者</th> <th>价格</th> <th>库存数量</th> <th>操作</th> </tr> <c:forEach var="book" items="${bookList}"> <tr> <td>${book.isbn}</td> <td>${book.bookName}</td> <td>${book.author}</td> <td>${book.price}</td> <td>${book.stock}</td> <td><a href="<c:url value='/bookEdit.jsp'><c:param name='isbn' value='${book.isbn}'/></c:url>">修改</a></td> </tr> </c:forEach> </table> </body> </html> ``` 在上述代码,我们使用 JSTL 标签库来遍历所有的书籍信息,并将其显示在。同时,我们使用 c:url 标签来生成修改页面的超链接,其,通过 c:param 标签来传递 ISBN 编号。 3. 需要建立另外的Servlet,用来完成数据库books字段的修改。 我们可以编写如下的 Servlet: ``` public class BookEditServlet extends HttpServlet { private BookService bookService = new BookService(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String isbn = req.getParameter("isbn"); Book book = bookService.getBookByIsbn(isbn); req.setAttribute("book", book); req.getRequestDispatcher("/bookEdit.jsp").forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String isbn = req.getParameter("isbn"); String bookName = req.getParameter("bookName"); String author = req.getParameter("author"); double price = Double.parseDouble(req.getParameter("price")); int stock = Integer.parseInt(req.getParameter("stock")); Book book = new Book(isbn, bookName, author, price, stock); bookService.updateBook(book); resp.sendRedirect("/bookList"); } } ``` 在上述代码,我们通过调用 BookService 的 getBookByIsbn() 方法来获取指定 ISBN 编号的书籍信息,并将其保存到 request 对象。然后,我们通过请求转发的方式将其传递给 bookEdit.jsp 页面进行显示。 在 bookEdit.jsp 页面,我们可以使用单的形式来编辑书籍的信息,并将其提交到 BookEditServlet 进行处理。具体代码如下: ``` <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>编辑图书</title> </head> <body> <h1>编辑图书</h1> <form action="<c:url value='/bookEdit'/>" method="post"> <input type="hidden" name="isbn" value="${book.isbn}"/> <p> <label>书名:</label> <input type="text" name="bookName" value="${book.bookName}"/> </p> <p> <label>作者:</label> <input type="text" name="author" value="${book.author}"/> </p> <p> <label>价格:</label> <input type="text" name="price" value="${book.price}"/> </p> <p> <label>库存数量:</label> <input type="text" name="stock" value="${book.stock}"/> </p> <p> <input type="submit" value="保存"/> </p> </form> </body> </html> ``` 在上述代码,我们使用单的形式来编辑书籍的信息,并将其提交到 BookEditServlet 进行处理。其,我们通过隐藏域来传递 ISBN 编号。同时,我们使用 JSTL 标签库来生成单的 action 属性。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

槐序二十四

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值